我在做什么:

我试图从.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;
}


我的问题:


现在,由于ChunkSize的大小为4字节,并且采用小尾数格式,因此我将其转换为long值以打印正确的值。
带有十六进制输出的printf语句显示:ffffffb4:4f:02:00但我已将格式指定为%02x,因此它最多应显示2个值的十六进制,这对于部分4f:02:00来说是好的,但是第一部分ffffffb4是不是。为什么?
假设读取的4个字节在小字节序中为b4:4f:02:00,在大字节序中为0x00024FB4,即151476,但是在代码中,倒数第二个printf打印以下内容:ChunkSize is: 151220 bits,为什么?


谢谢。

最佳答案

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


这并不意味着,它表示在必要时至少显示2个数字并用0填充。将参数强制转换为unsigned char以除去f数字。

关于c - 不正确的比特流到C中的长转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32445906/

10-12 14:18