【发布时间】:2011-07-28 18:18:06
【问题描述】:
我正在关注这个在 C++ 中使用 OpenAL 的教程:http://enigma-dev.org/forums/index.php?topic=730.0
正如您在教程中看到的,它们留下了一些未实现的方法,并且我在实现 file_read_int32_le(char*, 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 中)它说 *buffer 的十六进制值是 0x72,它只有一个字节。当我使用 malloc(4) 创建 newBuffer 时,我得到一个 4 字节的缓冲区(*newBuffer 类似于 0xC0000003),然后在操作之后变为 0x72000000。我假设我正在寻找的结果是 0x00000027(编辑:实际上是 0x00000072),但我将如何实现呢? char* 缓冲区和 unsigned int* newBuffer 之间的转换是否与此有关?
【问题讨论】:
-
实际上,该值将是 0x00000072,而不是 0x00000027。基本上,它是交换字节顺序,而不是 nybble 顺序。
-
为什么该方法同时提供缓冲区和文件指针?这是不直观的。
-
我不确定。这就是他们在教程中调用它的方式,所以我坚持使用他们对函数的声明。我同意这很奇怪。
标签: c++ xcode endianness openal