В рамках более длительного проекта я экспериментировал с кодированием и декодированием звука с помощью python, используя библиотеки pyaudio и wave.
Я начал с создания подпрограммы, которая считывает данные из файла волны, и каждый раз, когда она читает фрейм данных из файла волны, она записывает его в текстовый файл, преобразуя строку байтов, полученную из файла волны, в строку. он может писать в текстовый файл.
Это все хорошо, но меня очень смущают некоторые появляющиеся символы, и мне было интересно, есть ли какие-либо объяснения того, что некоторые из этих символов на самом деле означают/делают в контексте байтовых строк, или они ошибочны, и моя программа неисправен:
b'*\x0f+\x0f'
(не ожидал *
или +
)
b'+\x03)\x03'
(не ожидал +
или )
)
b'@\xf2D\xf2'
(не ожидал @
или D
)
Есть еще несколько странных комбинаций, но есть ли какие-либо объяснения этим символам, которые, в свою очередь, сделали бы мое понимание других необычных символов более ясным? Я новичок в понимании строк байтов, поэтому имейте это в виду.
Например, b'\x2a' == b'*'
оценивается как True
.
@Blorgbeard Я хорошо знаю, что это двоичный файл из аудиоданных - мое замешательство связано с ролью этих странных символов в строке байтов. Обычный шаблон, как я заметил, \x00\x00\x00\x00
для одного кадра 32-битных данных, не так ли?
Используйте binascii.hexlify()
, чтобы получить чисто шестнадцатеричное представление ваших данных, даже для 95 из 256 возможных значений байтов, которые попадают в печатный диапазон ASCII.
Как именно вы конвертируете данные? Опубликованные вами строки выглядят так, как будто ничего не было преобразовано - вы просто обрабатываете волновые данные, как если бы они уже были текстом, и позволяете python «делать свое дело», распечатывая шестнадцатеричные значения для байтов, которые не соответствуют печатным символам.
@ЛевМ. Извините, я не имел в виду преобразование, я имел в виду перенос из звукового волнового файла, состоящего из чистого двоичного кода, в текстовый файл, содержащий текст.
@RWN, тогда вы должны заметить, что если вы запишете эти строки в файл как есть, вы получите не текстовый файл, а просто копию волнового файла. Преобразование в «\ x» выполняется только функцией печати python, если вы используете функцию файлового класса write
, она будет записывать байты в файл как есть.
Нет такой вещи, как "текстовый файл" как таковой, есть просто "файлы", которые содержат потоки байтов. По соглашению мы называем файл «текстовым файлом», если он содержит только байты, которые можно интерпретировать как текст. Таким образом, если вы записываете двоичные (волновые) данные в файл, это будет волновой файл, а не текстовый файл.
Когда это возможно, байт в значении byte
отображается как символ ASCII, закодированный байтом.
>>> ord('*')
42
>>> b'\x2a' # 0x2a == 42
b'*'
В противном случае используется формат \xXX
.
>>> b'\x00\x2a' # Two bytes: the null byte and 42
b'\x00*'
Значит, эти случайные символы соответствуют определенной комбинации двух шестнадцатеричных цифр, т. е. b'x2a'
= b'*'
, как ключ/значение словаря?
Я думаю, вы могли бы сказать это таким образом, да. \x..
используется только тогда, когда этот байт не соответствует печатному символу ASCII.
Это аудиоданные, верно? Это двоичный файл, а не текст. Это просто байты, которые представляют собой печатные символы ASCII при интерпретации как текст.