質問

このの質問と同様に、私はしようとしていますID3v2タグヘッダーを読み取って、pythonで個々のバイトを取得する方法を見つけるのに問題があります。

最初に10バイトすべてを文字列に読み取りました。次に、個々の情報を解析します。

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

structパッケージは私が望むもののようですが、動作させることができません。

これまでの私のコードはここにあります(私は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]

正しい値以外の値を印刷するのは明らかに正しくありません。

役に立ちましたか?

解決

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

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

>ビッグエンディアン用です(整数の最大部分が最初に来ます)。これはid3タグが使用する形式です。

他の整数サイズの場合、異なるフォーマットコードを使用します。例えば。 " i"符号付き32ビット整数の場合。詳細は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)

他のヒント

なぜ自分で書くのですか? (これらの他のオプションをチェックアウトしていないと仮定します。)PythonのMP3からID3タグ情報を読み込むためのオプションがいくつかあります。 回答をチェック/stackoverflow.com/questions/8948/accessing-mp3-meta-data-with-python ">これの質問。

  

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

FWIW、これには既にモジュールがあります。

struct パッケージを推奨するつもりでしたが、それを試したと言っていました。これを試してください:

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

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

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