わかりましたので、pythonを使用して波形画像を作成し、song = wave.open()
およびsong.readframes(1)
を使用して.wav
ファイルから生データを取得しています。
b'\x00\x00\x00\x00\x00\x00'
私が知りたいのは、これを3つの別々のバイトに分割する方法です。 b'\x00\x00'
、b'\x00\x00'
、b'\x00\x00'
各フレームは3バイト幅なので、波形を作成するには個々のバイトの値が必要です。とにかくそうする必要があると思います。
byte
オブジェクトでスライシングを使用できます:
_>>> value = b'\x00\x01\x00\x02\x00\x03'
>>> value[:2]
b'\x00\x01'
>>> value[2:4]
b'\x00\x02'
>>> value[-2:]
b'\x00\x03'
_
ただし、これらのフレームを処理するときは、おそらく memoryview()
オブジェクト ;についても知りたいでしょう。これらを使用すると、基礎となるバイトに「ビュー」をキャストするだけで、余分な作業をせずにバイトをCデータ型として解釈できます。
_>>> mv = memoryview(value).cast('H')
>>> mv[0], mv[1], mv[2]
256, 512, 768
_
mv
オブジェクトは、2バイトごとに符号なしショートとして解釈するメモリビューになりました。そのため、長さは3になり、各インデックスは、基になるバイトに基づく整数値になります。
バイトをリストに分割する方法は次のとおりです。
data = b'\x00\x00\x00\x00\x00\x00'
info = [data[i:i+2] for i in range(0, len(data), 2)]
print info
結果を与える:
['\x00\x00', '\x00\x00', '\x00\x00']
あなたは実際にシリアライゼーション/デシリアライゼーションについて尋ねています。 struct.packとstruct.unpackを使用します( https://docs.python.org/3/library/struct.html )。これにより、アンパックとエンディアンスワッピングなどの両方を行うニースプリミティブが得られます。例えば:
import struct
struct.unpack("<H",b"\x00\x01") # unpacks 2 byte little endian unsigned int
struct.unpack(">l",b"\x00\x01\x02\x03") # unpacks 4 byte big endian signed int
この例では、バイトではなく2バイトのワードを分割します。
この質問は、バイナリ文字列の分割に関する検索でも出てくるので:
value = b'\x00\x01\x00\x02\x00\x03'
split = [value[i] for i in range (0, len(value))]
# now you can modify, for example:
split[1] = 5
# put it back together
joined = bytes(split)
data = b'\x00\x00\x00\x00\x00\x00'
info = [data[i:i+2] for i in range(0, len(data), 2)]
print info
次の行の詳細はどこで参照できますか?
info = [data[i:i+2] for i in range(0, len(data), 2)]
わかりません data[i:i+2]