我尝试从二进制文件中读取值。我知道偏移量(3201)并使用它。
示例代码:
FILE *bin_file;
int *job_id_buffer;
bin_file = fopen("sample.sgy", "rb");
if (bin_file == NULL)
{
// ... skipped ...
}
fseek(bin_file, 3201, SEEK_SET);
job_id_buffer = (int*)malloc(sizeof(int));
fread(job_id_buffer, sizeof(int), 1, bin_file);
printf("%d\n", (int)job_id_buffer[0]);
fclose(bin_file);
看起来我不知道如何正确阅读价值。
但问题是,当我得到结果时,值 993024 ,而我100%知道正确值 9999 。
请你帮我理解我做错了什么?
提前谢谢!
答案 0 :(得分:5)
快速查看您获得的值:
预期:9999 = 0x0000 270F
收到:993024 = 0x00 0F27 00
由此我们可以看到两件事:
0F27
是270F
,带有交换字节。显然,文件中的字节顺序(endiannes)与内存中的字节顺序(endiannes)不同;
如果仅交换字节顺序,您将从文件中获取0x0F270000
,但该值似乎会移位一个字节。
这可能意味着两件事之一,具体取决于文件的字节顺序:
如果文件是little-endian(并且CPU是big-endian),那么你应该寻求偏移3202
而不是3201
。
如果文件是big-endian(并且CPU是little-endian),那么你应该寻求偏移3200
而不是3201
。
因此,检查文件的字节顺序并更正偏移量;然后,将从文件的字节顺序读取的数据转换为CPU的字节顺序(在这种情况下反转字节)以获得正确的值。
要在任何CPU上创建正确的代码,您可以使用be32toh()
, or le32toh()
,将big-endian或little-endian文件数据转换为正确的CPU字节序。