從wave文件的讀寫看程序中struct的設計
在windows中,對于wave音頻格式,有如下的一系列結構:
typedef struct waveformat_tag 

{
WORD wFormatTag; /**//**//**//* format type */
WORD nChannels; /**//**//**//* number of channels (i.e. mono, stereo, etc.) */
DWORD nSamplesPerSec; /**//**//**//* sample rate */
DWORD nAvgBytesPerSec; /**//**//**//* for buffer estimation */
WORD nBlockAlign; /**//**//**//* block size of data */
} WAVEFORMAT;
typedef struct pcmwaveformat_tag 

{
WAVEFORMAT wf;
WORD wBitsPerSample;
} PCMWAVEFORMAT;
struct TWavHeader

{
char rId[4]; //標志符(RIFF)
DWORD rLen; //數據大小,包括數據頭的大小和音頻文件的大小
char wId[4]; //格式類型("WAVE")
char fId[4]; //"fmt"
DWORD fLen; //Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT wavFormat;
char dId[4]; //"data"
DWORD wSampleLength; //音頻數據的大小
};采用這樣的結構寫的音頻文件,文件頭會有如下的結果:

不難發現,第0020行明顯多出幾個字節。這樣造成聲音文件無法播放出來。
從結構定義角度來看,也不難發現PCMWAVEFORMAT結構中,WAVEFORMAT結構前四個成員已經4字節對齊了,最后一個成員nBlockAlign只占用兩字節,按照字節對齊規則,需要在填充兩個無效字節,從而保證到4字節對齊;PCMWAVEFORMAT結構還是采用4字節對齊,因此只占用兩字節的
最后一個成員wBitsPerSample還需要兩字節補齊,因此才有了上圖的字節分布。
解決方法就是采用緊縮結構,不允許字節對齊。
從這個親身經歷來看,字節非對齊的結構也是一種潛在的bug,程序中設計的各種結構盡量保持字節對齊是一種好的習慣。
posted on 2008-06-16 11:00 Wealth 閱讀(1972) 評論(4) 編輯 收藏 引用 所屬分類: C++

