簡體   English   中英

每個樣本的istream :: read和WAV格式位

[英]istream::read and wav format bits per sample

下面是我用來讀取每個樣本波形的16位和32位代碼的代碼,它們工作得很好。

我的問題是,如何讀取其余的8位無符號,24位有符號和32位浮點數

讀取一個16位帶符號的wav的樣本:

short buffer;

file.read( ( char * ) &readbuffer, 2 );

讀取一個32位帶符號wav的示例:

int buffer;

file.read( ( char * ) &readbuffer, 4 );

您正在對目標計算機進行一些假設。 根據Microsoft WAV格式 ,所有示例數據均為低位字節序。 您還期望各種數據類型成為所需的大小,但情況並非總是如此。

但是隨着您當前的例行工作為您服務,我們暫時不會專注於此(但是您可能應該在某些時候解決這些問題)

32位浮點

如果我們忘記了可怕的字節序和非標准的類型大小,那么使用您的其他代碼作為模板,則32位浮點大小寫將變得相對簡單:

float buffer;
file.read( ( char * ) &buffer, 4 );

這個問題涵蓋了從二進制源讀取浮點數的更多詳細信息。

x位無符號

由於我們知道您的機器正確解釋了16位和32位的情況,因此我們可以假定它是低位優先的。 這意味着您可以將所有內容讀入已初始化為零的unsigned int,並且已經為您正確填充了其余字節:

unsigned int buffer = 0;
file.read( ( char * ) &buffer, 1 );   // 8bit unsigned integer

buffer = 0;
file.read( ( char * ) &buffer, 3 );   // 24bit unsigned integer

x位簽名

最后,如果要讀取帶符號的整數,則需要根據剛剛讀取的數字的值填充緩沖區變量的剩余字節:

  • 如果數字為正數,則只需填充0
  • 如果數字為負(設置了最高有效字節的最高位),則使用\\ xFF字節填充。

此代碼適用於24位帶符號整數:

long buffer;
int number_of_bytes = 3;             // 24 bit signed integer

file.read( (char *) &buffer, number_of_bytes);

// Determine the padding byte
unsigned char padding_byte = 0;
if ( ((char*) &buffer)[number_of_bytes - 1] & 128) {
    padding_byte = 255;
}

// Pad the data
for (int i = number_of_bytes; i < sizeof(buffer); i++) {
    ((char*) &buffer)[i] = padding_byte;
}

同樣,我覺得我應該指出,由於您未檢查字節序,因此該代碼將在某些機器上失敗。 但是,解決該問題所需要做的就是檢查正在運行代碼的計算機的字節序,如果您使用的是大字節序計算機,則反轉字節順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM