ID3v2のヘッダーの必要な値を取得するにはどうすればよいですか?
質問
MP3ファイルのID3v2のヘッダーを読み込もうとしています。 ID3を入手/印刷することができ、タイプのcharである「バージョン」と「subversion」を印刷したいのですが、必要なものを取得できません。
これがコードです:
}
.....
fseek(file,0,SEEK_SET);
fread(&tag.TAG, 1, sizeof(tag),file); // tag is structure with elements of header
if(strncmp(tag.TAG,"ID3", 3) == 0)
{
fread(&tag.version,1, sizeof(tag),file);
fread(&tag.subversion,1, sizeof(tag),file);
printf("ID3v2.%s.%s", tag.version, tag.subversion);
}
}
A.
解決
ヘッダーが一度だけ読む必要があります。あなたが持っているなら
struct id3v2hdr {
char TAG[3];
unsigned char version;
unsigned char subversion;
...
}
あなたのコードは次のとおりです。
fseek(file,0,SEEK_SET);
fread(&tag.TAG, 1, sizeof(tag),file); // tag is structure with elements of header
if(strncmp(tag.TAG,"ID3", 3) == 0)
{
printf("ID3v2.%hhd.%hhd", tag.version, tag.subversion);
}
ご了承ください version
と subversion
印刷可能な文字ではなく、バイトサイズの整数ですので、使用する必要があります %hhu
(%hhd
それらが署名されている場合)そのフォーマット仕様として。
また、構造体の最初の要素へのポインターと、構造体へのポインターは等しく比較されるため、 fread
ラインへ:
fread(&tag, 1, sizeof(tag),file); // tag is structure with elements of header
不要です(難しいですそれは意図をより明確に示すでしょう)。
他のヒント
十分なバイトを読んでいますか? tag.tagのアドレスを渡しますが、sizeof(tag.tag)ではなくsizeof(tag)を供給しています。
そうでしょう %c
チャーを印刷するためではありません %s
(ヌルターミネーションの印刷に使用されます char*
):
printf("ID3v2.%c.%c", tag.version, tag.subversion);
使用する %d
バイトを数字として見たい場合。
所属していません StackOverflow