Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fread似乎在从右到左读取文件_C_Endianness - Fatal编程技术网

C fread似乎在从右到左读取文件

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);

我必须从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


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

您遇到了一点一点的问题。以太网是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]);