我尝试读取id3标签的标题:
int main() {
union MP3Header {
char header[10];
struct HeaderStruct {
char tagIndicator[3];
char version[2];
char flags[1];
char size[4];
} headerStruct;
};
fstream file;
file.open("file.mp3", ios::binary || ios::in);
MP3Header header;
//read header of id3
file.read(header.header, 10);
//tag description
char tag[4] = {0};
strncpy(tag, header.headerStruct.tagIndicator, 3);
cout << tag << endl;
//get size
string sizeTags = "";
for (int i=0; i<4; i++) {
bitset<8> bit_set = header.headerStruct.size[i];
sizeTags += bit_set.to_string();
}
cout << sizeTags << endl;
}
对于某些mp3文件大小的标签是... 1111101110110(8054 bytes) 我认为这段代码错了,因为大小很奇怪。
答案 0 :(得分:0)
总结一下我失眠的咆哮......
我使用AS3但我也学习了C ++,C#,Java,PHP,Python等代码,然后将代码逻辑转换为AS3。现在我将向您展示我们如何在Flash(AS3)中完成它,也许您可以将其转换为C ++。
(用于向上检查ID3 v2)
mp3_Bytes.position = 6; //go to 7th byte (offset 6) for Header Size bytes (integer)
mp3_headerLength = readSynchsafeInt ( mp3_Bytes.readUnsignedInt() );
mp3_headerLength += 10; //add 10 cos result always seems to be 10 bytes less
trace("Header Length : " + mp3_headerLength);
和同步Safe函数转换读取Int(四个字节)看起来像:
private function readSynchsafeInt (synch:int):int
{
return (synch & 127) + 128 * ((synch >> 8) & 127) + 16384 * ((synch >>16) & 127) + 2097152 * ((synch >> 24) & 127);
}
我快速查找了你并找到了这个C ++:Why are there Synchsafe Integer?
同步安全功能看起来像是
int ID3_sync_safe_to_int( uint8_t* sync_safe )
{
uint32_t byte0 = sync_safe[0];
uint32_t byte1 = sync_safe[1];
uint32_t byte2 = sync_safe[2];
uint32_t byte3 = sync_safe[3];
return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3;
}
BTW:AS3函数恰好用于转换整数字节的总和,而C ++代码示例正在处理实际的整数字节。相同结果的两种不同方法。选择一个( AS3 转换从bytes = result或 C ++ 转换字节获得的数字=获得数字=结果)