繁体   English   中英

如何在python中将字节串拆分为单独的字节

[英]How to split a byte string into separate bytes in python

好的,我一直在使用python尝试创建波形图像,我使用song = wave.open()song.readframes(1).wav文件中获取原始数据,返回:

b'\x00\x00\x00\x00\x00\x00'

我想知道的是我如何将它分成三个独立的字节,例如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个字节解释为unsigned short; 所以现在它的长度为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 )。 这为您提供了很好的原语,可以进行解包和endian交换等操作。 例如:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM