typedef struct _Wave_Header { #pragma pack(1) char riff_id[4]; //"RIFF" int32_t riff_datasize; // RIFF chunk data size char riff_type[4]; // "WAVE" char fmt_id[4]; // "fmt " int32_t fmt_datasize; // fmt chunk data size int16_t fmt_compression_code; // 1 for PCM int16_t fmt_channels; // 1 or 2 int32_t fmt_sample_rate; // samples per second int32_t fmt_avg_bytes_per_sec; // sample_rate*block_align int16_t fmt_block_align; // number bytes per sample bit_per_sample*channels/8 int16_t fmt_bit_per_sample; // bits of each sample. char data_id[4]; // "data" int32_t data_datasize; // data chunk size. #pragma pack() }WaveHeader;
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。