0

私は私が持っているこの小さな問題と非常に混乱しています。インデックス付けされていないファイル形式のヘッダーがあります。(より具体的にはID3ヘッダー)これで、このヘッダーは、データが実際にはID3タグ(TAG文字列btw)であることを確認するために、文字列または3バイトを格納します。ポイントは、TAGファイル形式のこれがnullで終了しないことです。 。したがって、実行できることが2つあります。

  • ファイル全体をロードし、fread終了していない文字列を比較するには、を使用しますstrncmp。だが:
    1. これはハッキーに聞こえます
    2. 誰かがそれを開いて、これについての事前の知識なしに文字列を操作しようとするとどうなりますか?
  • もう1つのオプションは、ファイルをロードすることですが、C構造体はファイル形式に正確にマップする必要はなく、適切なnullターミネータを含めてから、一意の呼び出しを使用して各メンバーをロードする必要があります。しかし、これもハッキーで退屈な感じがします。

特にそのようなものを扱った実践的な経験を持つ人々からの助けはありがたいです。

4

5 に答える 5

3

何かを解析するときに最初に考慮すべきことは次のとおりです。これらのフィールドの長さは、サイズが固定されているか、カウントが接頭辞として付けられていますか(たとえば、ほぼすべてのグラフィックファイルには固定サイズ/構造ヘッダーがあり、その後にピクセルの可変サイズのシーケンス)?または、フォーマットに何らかの方法で区切られた完全に可変の長さのフィールドがありますか(たとえば、MPEG4フレームはバイト0x00、0x00、0x01で区切られます)?通常、この質問への答えは、それを解析する方法を教えるのに大いに役立ちます。

于 2009-10-18T14:53:59.697 に答える
2

何かを学んでいるだけの場合は、ファイルの最後の128バイトを読み取り、ブロックの最初の3文字がであるかどうかを確認することで、MP3ファイルでID3v1タグを見つけることができますTAG

実際のアプリケーションでは、TagLibを使用します。

于 2009-10-18T14:42:52.350 に答える
2

ファイル形式の仕様で、特定の3バイトに「T」、「A」、「G」(84、65、71)に対応する値があると記載されている場合は、それらの3バイトだけを比較する必要があります。

この例でstrncmp()は、OKです。一般に、memcmp()は文字列の終了を気にする必要がないため優れているため、比較しているバイトストリーム(タグ)にASCIINUL'\0'文字が含まれていても機能しmemcmp()ます。

また、使用しているファイル形式が主に印刷可能なデータであるか、それとも主にバイナリデータであるかを認識する必要があります。印刷可能なデータに使用する手法は、バイナリデータに使用される手法とは異なる場合があります。バイナリデータに使用される手法は、印刷可能なデータで使用するために変換される場合があります(常にではありません)。大きな違いの1つは、バイナリデータの値の長さがファイルに埋め込まれているため、またはファイルの構造がわかっているために、事前にわかっていることです。印刷可能なデータでは、フィールドに暗黙の境界がある可変長のエンコーディングを扱っていることが多く、その前に長さのエンコーディング情報はありません。

たとえば、Unixパスワードファイル形式は、可変長フィールドを使用したテキストエンコーディングです。':'を使用してフィールドを区切ります。次の「:」または行の終わりに出くわすまで、フィールドの長さを知ることはできません。これには、ASN.1 1を使用してエンコードされたバイナリ形式とは異なる処理が必要です。この場合、フィールドは、実際のデータの前にタイプインジケーター値(通常は1バイト)と長さ(タイプに応じて1、2、または4バイト)を持つことができます。フィールド。


1 ASN.1は(当然のことながら)非常に複雑であると見なされています。多くのレベルで批判される可能性のある、それがどのように使用されるかについての非常に簡単な例を示しました。それにもかかわらず、基本的な考え方は有効です-長さ(およびASN.1では通常はタイプも)が(バイナリ)データの前にあります。これは、TLV(タイプ、長さ、値)エンコーディングとも呼ばれます。

于 2009-10-18T15:10:52.653 に答える
1

3バイトを保持し、各バイトを文字、、およびと比較'T''A'ます'G'。これはあまり賢くないかもしれませんが、仕事をうまくやり遂げ、さらに重要なことに正しくやり遂げます。

于 2009-10-18T14:29:27.250 に答える
0

そして、id3v1とid3v1.1の2つの異なる意味というジャンルを忘れないでください

于 2009-10-19T23:40:41.743 に答える