我有一个32位整数的二进制文件,我需要阅读。但是当我使用ifstream.read()(c ++)和fread()(C)时,他们给了我一个完全错误的答案。我认为它正在向后读取整数值。例如,如果我读取位字符串\0\0\0\r
(转换为字符),那么当我得到值13时,我得到值218,103,808。这些转换为二进制的值是:
并且转换为二进制的位串应为:
<00> 0000 0000 0000 0000 0000 0000 0000 1101(\0\0\0\r
)
因为前三个字节是空字符,最后一个字节的ascii值是13
所以首先,如果我说的话是错的,请纠正我,其次,为什么它给出218,103,808而不是13的值?第三,我怎样才能得到13的理想结果?
这里有一些其他有用的信息:
我以前读过的代码行是file.read((char*)&i, 4);
,其中i
是无符号整数,而文件是ifstream
;和fread(&i, 4, 1, file);
其中i
再次是unsigned int,文件是FILE*
。
如果我只读取最后一个字节\r
,那么我确实得到了正确的值,但我需要能够读取任何int而不仅仅是那些可以容纳1个字节数据的int。
如果我能得到一个,C或c ++的答案,那就太棒了,但我希望得到C和c ++的答案。
提前致谢!
答案 0 :(得分:0)
该文件以little endian字节顺序写入。您的机器使用大端字节顺序。或相反亦然。显而易见的解决方案是在读写时反转字节顺序。这里有很多问题可以解决这个问题。
您可以考虑更深入地考虑是否应该使用机器字节顺序写入文件,如果确实如此。一种常见的方法是使用网络字节顺序(总是大端)写入文件,然后在读取数据时转换为主机字节顺序(机器字节顺序)。
然后可能再次以网络字节顺序写入文件,并且您的程序刚刚错过了转换为主机字节顺序所需的步骤。
这个程序
#include <stdio.h>
#include <stdint.h>
uint32_t reversed(uint32_t val)
{
return ((val>>24)&0xff) |
((val<<8)&0xff0000) |
((val>>8)&0xff00) |
((val<<24)&0xff000000);
}
int main(void)
{
uint32_t val = 13;
printf("%d\n", val);
printf("%d\n", reversed(val));
return 0;
}
有这个输出:
13 218103808
这些是您问题中的两个值。我相信这会让你相信你有一个简单的字节序逆转。