質問
このの質問と同様に、私はしようとしています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タグ情報を読み込むためのオプションがいくつかあります。
ID3v2タグヘッダーを読み取ろうとしています
FWIW、これには既にモジュールがあります。
struct
パッケージを推奨するつもりでしたが、それを試したと言っていました。これを試してください:
self.major_version = struct.unpack('H', self.whole_string[3:5])
pack()
関数はPythonデータ型をビットに変換し、 unpack()
関数はビットをPythonデータ型に変換します。