我必须从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个字节的方向。但是,它会打印:
结果= cfa154b3261b
这正是我期望的方向,但是从右到左阅读!为什么会发生这种情况,我应该如何解决?
答案 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地址中插入了预期的:分隔符。