2013-11-16 2 views
8

Ok поэтому я использую питон, чтобы попытаться создать волновую форму, и я получаю исходные данные из файла .wav с использованием song = wave.open() и song.readframes(1), который возвращает:Как разбить строку байт на отдельные байты в питоне

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

Что я хочу знать, так это то, как я разбил это на три отдельных байта, например b'\x00\x00', b'\x00\x00', b'\x00\x00', потому что каждый кадр имеет ширину 3 байта, поэтому мне нужно значение каждого отдельного байта, чтобы иметь возможность создавать волновую форму. Я верю, что мне так все равно нужно.

+0

[? Что возвращается wave.readframes] (HTTP: // stackoverflow.com/questions/2063565/what-is-returned-by-wave-readframes) – wwii

ответ

15

Вы можете использовать нарезку на 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() objects; они позволяют интерпретировать байты как типы данных C без каких-либо дополнительных усилий с вашей стороны, просто бросая «вид» на нижележащих байтах:

>>> mv = memoryview(value).cast('H') 
>>> mv[0], mv[1], mv[2] 
256, 512, 768 

Объект mv является теперь видом памяти интерпретации каждого 2 байта в качестве unsigned short; поэтому теперь она имеет длину 3, и каждый индекс представляет собой целочисленное значение, основанное на базовых байтах.

+0

Это то, что я получаю, когда я запускаю первую строку вашего второго блока кода: «TypeError: невозможно сделать вид памяти, потому что объект не имеют буферный интерфейс ". – user124384

+0

@ user124384 означает, что входной объект не является объектом 'bytes',' bytearray' или 'memoryview' или другим типом, который реализует буферный протокол. Не переходите, например, в строку. –

+0

Но вы использовали строку («H») в вашем примере, не так ли? Кроме того, я пробовал переходить в bytearray и получил ту же ошибку. – user124384

8

Вот способ, которым вы можете разделить байты в список:

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'] 
Смежные вопросы