2013-07-21 71 views
4

我現在正在使用wav文件,我正在解析它們。我現在不想使用庫。 我用fstream打開wav文件,並讀取所有的數據向量。 現在我想解析wav文件頭。例如,我想要獲得第4到第8個字節之間的文件大小。我想把它分配給一個整數。我會很容易地用memcpy完成這項工作。但既然是C++,我不想使用memcpy。 我最終的解決方案是:如何從矢量複製一個整數<char>

std::vector<unsigned char>::iterator vectorIte = soundFileDataVec.begin(); 
vawParams.totalfilesize = 0; 
//Since it is little endian I used reverse_copy 
std::reverse_copy(vectorIte + 4, vectorIte + 7, (unsigned char*)&vawParams.totalfilesize); 

我不是很滿意(無符號字符*)轉換爲整數的指針。我懷疑有一個更好的辦法比我好。你可以請教一個更好的方法嗎?

+2

是否有可能將.wav頭文件讀入結構中? (可能使用對齊編譯指示?) – tohava

回答

6

向量對元素使用連續的存儲位置,它們的元素可以使用到其元素的常規指針上的偏移量來訪問。所以,如果你不想做memcpy然後一個微不足道的解決方案是:

int header = *reinterpret_cast<const int*>(&soundFileDataVec[4]); 

這讀取你四個字節(您可能需要轉換從一個字節順序到另一個)。

+0

我認爲你的表單更容易理解。我期待這個案例的一個std函數,因爲我不喜歡這個演員。我認爲這樣的功能不存在。感謝您的回答 –

2

一旦你進入二進制序列化的領域,如果你想要可移植並且你不想使用一個庫,那麼你幾乎必須在抽象層之下得到一個類型是如何呈現給你的編程語言。你必須明確地知道它是如何存儲在文件中的,你必須明確地知道如何將其恢復出來,並將其翻譯成你編譯的平臺上的編譯器類型的表示形式。

在這些限制下,試圖避免劇組可能本質上是錯誤的。

相關問題