【问题标题】:Incorrect result returned after reading binary file (int value)读取二进制文件后返回不正确的结果(int 值)
【发布时间】:2016-05-11 17:06:54
【问题描述】:

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

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

提前谢谢你!

【问题讨论】:

  • 9999 = 0x0000270F, 993024 = 0x000F2700
  • 您似乎偏离了一个字节,并且您的字节顺序错误。
  • 你确定文件的字节序和程序的一样吗?
  • @stark 我确定不是。
  • 首先@JimmyB 你是对的!问题出在 1 个字节中,我使用 3201 偏移量而不是 3200。谢谢!现在我有一个值 - 254214144(小端) - 如果将其转换为大端是 9999。附言我会将您的回答标记为正确,但我不知道您的评论如何 ^(

标签: c


【解决方案1】:

快速查看您获得的值:

预期:9999 = 0x0000270F

收到:993024 = 0x000F2700

由此我们可以看出两点:

  1. 0F27 是带有交换字节的270F。显然,文件内部的字节顺序(字节序)与内存中的不一样;

  2. 如果只交换字节顺序,您会从文件中获得0x0F270000,但该值似乎移动了一个字节。

这可能意味着两种情况之一,具体取决于文件的字节序:

如果文件是 little-endian(而 CPU 是 big-endian),您应该寻求偏移 3202 而不是 3201

如果文件是大端(并且 CPU 是小端),您应该寻求偏移 3200 而不是 3201

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

要创建在任何 CPU 上都正确的代码,您可以使用 be32toh(), or le32toh(), 分别将大端或小端文件数据转换为正确的 CPU 端。

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 2019-09-24
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多