二进制文件中的不一致的endianess

时间:2013-03-26 10:02:17

标签: c binaryfiles endianness

我编写了一个程序将数字写入二进制文件,代码如下:

    u_int16_t N=150;
    u_int16_t seed=3;

    FILE * outfile, *infile;

    outfile=fopen("tempfile","wb");
    //write these 2 16-bit numbers into binary file
    fwrite(&seed, 2, 1, outfile);
    fwrite(&N, 2, 1, outfile);

    infile=fopen("tempfile","rb");
    if(infile==NULL) fputs("Fire error\n",stderr);
    //get the size of the file
    fseek(infile,0,SEEK_END);
    int lsize=ftell(infile);
    rewind(infile);

    u_char * temp2=(u_char*)malloc(lsize);
    if(temp2==NULL) printf("temp2 error allocation\n");
    fread(temp2,1,lsize,infile);
    for(i=0;i<lsize;i++)
    printf("%x",temp2[i]);
    printf("\n");
    fclose(infile);
    free(temp2);

结果是:

30960

所以3打印为30,这是小端 虽然150打印为960,但有一个ad 0,实际上是0x96=150,所以它是大端

为什么3150的字节顺序不同,为什么会有额外的0? 谢谢!

1 个答案:

答案 0 :(得分:4)

当你这样做时

printf("%x",temp2[i]);

在十六进制数字中具有前导零的字节将打印,而为零。这意味着,例如0x03等数字将打印为3

通过向文件写入四个字节非常明显,但打印输出中只有五个十六进制数字(提示:四个字节是八个十六进制数字)。

相反,例如。

printf("%02x",temp2[i]);