ID3v2のヘッダーの必要な値を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/6376980

  •  28-10-2019
  •  | 
  •  

質問

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);
}

ご了承ください versionsubversion 印刷可能な文字ではなく、バイトサイズの整数ですので、使用する必要があります %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 バイトを数字として見たい場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top