fread似乎是从右到左读取文件

时间:2019-06-15 23:08:24

标签: c endianness

我必须从bin文件中读取信息(它们是100k 6字节以太网方向)。我用编辑器打开了它,里面是什么: enter image description here

因此使用代码:

 FILE *ptr;
    ptr = fopen("ethdirs.bin", "r");
    if (!ptr){
        printf("Unable to open file");
    }
    uint64_t test;
    fread(&test, 6, 1, ptr);
    printf("result = %lx \n", test);
    fread(&test, 6, 1, ptr);
     printf("result = %lx \n", test);
    fclose(ptr);

应打印1B26B354A1CF,这是前6个字节的方向。但是,它会打印:

  

结果= cfa154b3261b

这正是我期望的方向,但是从右到左阅读!为什么会发生这种情况,我应该如何解决?

1 个答案:

答案 0 :(得分:4)

您遇到了字节序问题。以太网是大端,但是您的CPU是小端。

不幸的是,没有内置可转换六个字节的功能,所以您必须自己做。

uint64_t test;
unsigned char convert[6];
fread(convert, 6, 1, ptr);
test =
    ((uint64_t)convert[0] << 40) |
    ((uint64_t)convert[1] << 32) |
    ((uint64_t)convert[2] << 24) |
    ((uint64_t)convert[3] << 16) |
    ((uint64_t)convert[4] << 8) |
    ((uint64_t)convert[5]);

某人也许可以找出更快的比特币,但您可能不在乎。

或者(取决于您在做什么),您可以像这样在自己的字节序中打印它:

unsigned char convert[6];
fread(convert, 6, 1, ptr);
//...
printf("%02X:%02X:%02X:%02X:%02X:%02X\n", convert[0], convert[1], convert[2], convert[3], convert[4], convert[5]);

这次我自由地在MAC地址中插入了预期的:分隔符。