我下面这个教程在C使用的OpenAL ++:http://enigma-dev.org/forums/index.php?topic=730.0问题转换字节序
正如您在本教程中看到,他们留下的一些方法未实现,和我有麻烦实施file_read_int32_le(字符*,FILE *)和file_read_int16_le(char *,FILE *)。显然它应该做的是从文件中加载4个字节(或者在int16的情况下加2个,我猜...),将它从小端转换为大端,然后将其作为无符号整数返回。下面的代码:
static unsigned int file_read_int32_le(char* buffer, FILE* file) {
size_t bytesRead = fread(buffer, 1, 4, file);
printf("%x\n",(unsigned int)*buffer);
unsigned int* newBuffer = (unsigned int*)malloc(4);
*newBuffer = ((*buffer << 24) & 0xFF000000U) | ((*buffer << 8) & 0x00FF0000U) | ((*buffer >> 8) & 0x0000FF00U) | ((*buffer >> 24) & 0x000000FFU);
printf("%x\n", *newBuffer);
return (unsigned int)*newBuffer;
}
调试时(XCode中),它说的*缓冲区的十六进制值是0x72,这是只有一个字节。当我使用malloc(4)创建newBuffer时,我得到一个4字节的缓冲区(* newBuffer就像0xC0000003),然后在操作之后变成0x72000000。我假设我正在寻找的结果是0x00000027(编辑:实际上是0x00000072),但我将如何实现这一目标?是否在char *缓冲区和unsigned int * newBuffer之间进行转换?
实际上,该值将是0x00000072,不是0x00000027。基本上,它是交换字节顺序,而不是nbble顺序。 –
好喊。编辑。 – benwad
为什么该方法提供缓冲区和文件指针?这是不直观的。 – trojanfoe