C fread似乎在从右到左读取文件
我必须从bin文件中读取信息(它们是100k 6字节)。我用编辑器打开了它,里面是: 因此,使用代码:C fread似乎在从右到左读取文件,c,endianness,C,Endianness,我必须从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);
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
这正是我期望的方向,但从右到左阅读!为什么会发生这种情况?我应该如何解决它?您遇到了一点一点的问题。以太网是big-endian,但您的CPU是little-endian 不幸的是,没有内置的转换六个字节,所以你必须自己做
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]);
这次我冒昧地在MAC地址中插入了预期的:分隔符。查找。扰流板警报:您的计算机是little endian,这意味着32位值的最高有效字节存储在内存中较高的字节地址。哦!我确实知道。那么问题是它是如何写在内存上的,对吗?不是它的打印方式吗?它们如何准确地写入内存不是问题。问题是你如何“打印”它,你必须知道内存顺序。如果要按内存顺序打印字节,请一次打印一个字节,而不是使用
%lx
将其作为一个完整的32位值。哦,明白了。我很“害怕”,因为我必须用这些指令做一些操作,所以如果它们是以“相反”的顺序写的,我当然会得到完全不同的答案。所以,没什么好担心的。谢谢。第一个代码是char,而第二个代码是unsigned char,对吗?当我尝试第一种方法时,我得到了错误(不是实际的错误,而是无意义的值)。我的代码可以很好地处理未签名字符tho@MiguelDuranDiaz:啊。只是一个我没抓住的错误。
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]);