8

この質問と同様に、ID3v2 タグ ヘッダーを読み込もうとしていますが、Python で個々のバイトを取得する方法がわかりません。

まず、10 バイトすべてを文字列に読み込みます。次に、個々の情報を解析したいと思います。

文字列内の 2 つのバージョン番号文字を取得できますが、これらの 2 つの文字を取得して整数を取得する方法がわかりません。

構造体パッケージは私が欲しいもののようですが、動作させることができません。

これまでの私のコードは次のとおりです(私はpython btwに非常に慣れていないので、簡単にしてください):

def __init__(self, ten_byte_string):
        self.whole_string = ten_byte_string
        self.file_identifier = self.whole_string[:3]
        self.major_version = struct.pack('x', self.whole_string[3:4]) #this 
        self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
        self.flags = self.whole_string[5:6]
        self.len = self.whole_string[6:10]

正しくフォーマットされていないため、以外の値を出力することは明らかにがらくたです。

4

4 に答える 4

16

16ビット整数として解釈したい2バイトの文字列がある場合は、次の方法で実行できます。

>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)

>はビッグエンディアン用であることに注意してください(整数の大部分が最初に来ます)。これはid3タグが使用するフォーマットです。

他のサイズの整数の場合は、異なるフォーマットコードを使用します。例えば。符号付き32ビット整数の場合は「i」。詳細については、help(struct)を参照してください。

一度に複数の要素を解凍することもできます。たとえば、2つの符号なしショートの後に符号付き32ビット値が続く場合:

>>> a,b,c = struct.unpack('>HHi', some_string)

あなたのコードで行くと、あなたは(順番に)探しています:

  • 3文字の文字列
  • 2つのシングルバイト値(メジャーバージョンとマイナーバージョン)
  • 1バイトのフラグ変数
  • 32ビット長の数量

このためのフォーマット文字列は次のようになります。

ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
于 2008-09-29T20:50:20.870 に答える
4

なぜあなた自身を書くのですか?(これらの他のオプションをチェックアウトしていないと仮定します。)PythonのMP3からID3タグ情報を読み取るためのオプションがいくつかあります。この質問で私の答えをチェックしてください。

于 2008-09-29T20:50:23.630 に答える
2

ID3v2タグヘッダーを読み込もうとしています

FWIW、このためのモジュールはすでにあります

于 2008-09-29T21:00:56.837 に答える
2

私はパッケージをお勧めするつもりでしたstructが、あなたはそれを試したと言いました. これを試して:

self.major_version = struct.unpack('H', self.whole_string[3:5])

関数はpack()Python データ型をビットにunpack()変換し、関数はビットを Python データ型に変換します。

于 2008-09-29T20:40:45.947 に答える