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

fread seems to be reading the file from right to left

我必须从 bin 文件中读取信息(它们是 100k 6 字节以太网方向)。我用编辑器打开它,里面是这样的:

所以使用代码:

 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 个字节的方向。但是,它打印:

result = cfa154b3261b

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

您被字节顺序问题困扰了。以太网是大端,但您的 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]);

有人可能会想出更快的 bitbash,但您可能不在乎。

或者(取决于你在做什么)你可以像这样以你想要的字节序打印它:

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 地址中插入了预期的 : 分隔符。