读取二进制文件后返回错误的结果(int值)

时间:2016-05-11 17:06:55

标签: c

我尝试从二进制文件中读取值。我知道偏移量(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

请你帮我理解我做错了什么?

提前谢谢!

1 个答案:

答案 0 :(得分:5)

快速查看您获得的值:

预期:9999 = 0x0000 270F

收到:993024 = 0x00 0F27 00

由此我们可以看到两件事:

  1. 0F27270F,带有交换字节。显然,文件中的字节顺序(endiannes)与内存中的字节顺序(endiannes)不同;

  2. 如果仅交换字节顺序,您将从文件中获取0x0F270000,但该值似乎会移位一个字节。

  3. 这可能意味着两件事之一,具体取决于文件的字节顺序:

    如果文件是little-endian(并且CPU是big-endian),那么你应该寻求偏移3202而不是3201

    如果文件是big-endian(并且CPU是little-endian),那么你应该寻求偏移3200而不是3201

    因此,检查文件的字节顺序并更正偏移量;然后,将从文件的字节顺序读取的数据转换为CPU的字节顺序(在这种情况下反转字节)以获得正确的值。

    要在任何CPU上创建正确的代码,您可以使用be32toh(), or le32toh(),将big-endian或little-endian文件数据转换为正确的CPU字节序。