在MIDI文件中读取十六进制字符串:缺少一些信息

时间:2013-10-29 20:32:08

标签: c++ hex midi

我有一个MIDI文件,我试图将其作为十六进制字符串读取:特别是我想输入一个MIDI文件并使十六进制字符串可供使用。我有以下内容:

ostringstream ss;
char * memblock;
unsigned char x;
std::string hexFile;

ifstream file ("row.mid", ios::binary);
ofstream output;
output.open("output.txt");

while(file >> x){
    ss << hex << setw(2) << setfill('0') << (int) x;
}

hexFile = ss.str();
cout << hexFile; 

当我输出hexFile时,我得到以下内容(注意结尾附近的空白区域):

4d546864000000060001000400f04d54726b0000001300ff58040402180800ff5103 27c000ff2f00

当我在十六进制编辑器中查看MIDI时,其内容如下:

4d546864000000060001000400f04d54726b0000001300ff58040402180800ff5103 0927c000ff2f00

后者绝对是正确的,正如轨道尺寸所证实的那样(我手动插入的白色空间周围,正确的一个有前者缺少的09)。

在我的代码中可能导致此09丢失的原因是什么?

3 个答案:

答案 0 :(得分:4)

默认情况下,ifstream会跳过空白。
你需要做的就是告诉它不要。

ifstream file ("row.mid", ios::binary);
file.unsetf(ios::skipws); //add this line to not skip whitespace

答案 1 :(得分:0)

09是用于制表字符的ANSII代码。默认的ofstream模式用于文本,这就是09字节被写为实际制表的原因。尝试也为输出文件设置ios::binary,它应该没问题。

output.open("output.txt", ios::binary);

答案 2 :(得分:0)

在声明ifstream file()之后附加以下行似乎可以解决问题:

file >> std::noskipws;