web-dev-qa-db-ja.com

pythonでバイト文字列を個別のバイトに分割する方法

わかりましたので、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バイト幅なので、波形を作成するには個々のバイトの値が必要です。とにかくそうする必要があると思います。

19
Razzad777

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になり、各インデックスは、基になるバイトに基づく整数値になります。

28
Martijn Pieters

バイトをリストに分割する方法は次のとおりです。

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']
12
kyle k

あなたは実際にシリアライゼーション/デシリアライゼーションについて尋ねています。 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)
1
AndrewStone
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]

0
E. Pashov