C中长转换的比特流不正确

时间:2015-09-07 20:51:57

标签: c file

我在做什么:

我正在尝试从.wav文件中读取Byte-By-Byte并尝试显示有关文件中存在的标头的一些信息。 (对于我的项目工作)。

我的代码(小部分): -

#include<stdio.h>

void main()
{
    char a[4],temp[4],i,j;
    int test;
    long value=0;
    FILE *file;
    file=fopen("hellomono.wav","rb");
    // 
    //4 bytes - chunkID @ "RIFF"
    fread(a,4,1,file);
    printf("ChunkID is: %s\n", a);

    //4 bytes - ChunkSize
    fread(a,4,1,file);
    for (i=0;i<4;i++) value=value+((long)a[i]<<(8*i));
    printf("ChunkSize is: %ld bits \n", value);
    printf("%02x:%02x:%02x:%02x\n",a[0],a[1],a[2],a[3] );

    value=0;
}

我的问题: -

  1. 现在,由于 ChunkSize 的大小为4字节且采用小端格式,我将其转换为long值以打印正确的值。 带有十六进制输出的printf语句显示:ffffffb4:4f:02:00但我已将格式指定为%02x,因此它应显示最多为2的十六进制值,这对于4f:02:00部分有用但第一部分ffffffb4并非如此。为什么呢?

  2. 我们假设4字节读取是小端的b4:4f:02:00,大端的0x00024FB4 151476 ,但在代码中,第2个最后的printf打印以下内容:ChunkSize is: 151220 bits,为什么?

  3. 谢谢。

1 个答案:

答案 0 :(得分:1)

  

但我已将格式指定为%02x,因此它应显示最多2个值的十六进制

这并不意味着,这意味着如果需要,它会显示至少2位用0填充的数字。将参数转换为unsigned char以摆脱f数字。