Строка байтов, содержащая «*», «+», «)», «@» и другие необычные символы

В рамках более длительного проекта я экспериментировал с кодированием и декодированием звука с помощью python, используя библиотеки pyaudio и wave.

Я начал с создания подпрограммы, которая считывает данные из файла волны, и каждый раз, когда она читает фрейм данных из файла волны, она записывает его в текстовый файл, преобразуя строку байтов, полученную из файла волны, в строку. он может писать в текстовый файл.

Это все хорошо, но меня очень смущают некоторые появляющиеся символы, и мне было интересно, есть ли какие-либо объяснения того, что некоторые из этих символов на самом деле означают/делают в контексте байтовых строк, или они ошибочны, и моя программа неисправен:

  • b'*\x0f+\x0f' (не ожидал * или +)

  • b'+\x03)\x03' (не ожидал + или ))

  • b'@\xf2D\xf2' (не ожидал @ или D)

Есть еще несколько странных комбинаций, но есть ли какие-либо объяснения этим символам, которые, в свою очередь, сделали бы мое понимание других необычных символов более ясным? Я новичок в понимании строк байтов, поэтому имейте это в виду.

Это аудиоданные, верно? Это двоичный файл, а не текст. Это просто байты, которые представляют собой печатные символы ASCII при интерпретации как текст.

Blorgbeard 28.05.2019 23:33

Например, b'\x2a' == b'*' оценивается как True.

chepner 28.05.2019 23:35

@Blorgbeard Я хорошо знаю, что это двоичный файл из аудиоданных - мое замешательство связано с ролью этих странных символов в строке байтов. Обычный шаблон, как я заметил, \x00\x00\x00\x00 для одного кадра 32-битных данных, не так ли?

RWN 28.05.2019 23:36

Используйте binascii.hexlify(), чтобы получить чисто шестнадцатеричное представление ваших данных, даже для 95 из 256 возможных значений байтов, которые попадают в печатный диапазон ASCII.

jasonharper 28.05.2019 23:37

Как именно вы конвертируете данные? Опубликованные вами строки выглядят так, как будто ничего не было преобразовано - вы просто обрабатываете волновые данные, как если бы они уже были текстом, и позволяете python «делать свое дело», распечатывая шестнадцатеричные значения для байтов, которые не соответствуют печатным символам.

Lev M. 28.05.2019 23:37

@ЛевМ. Извините, я не имел в виду преобразование, я имел в виду перенос из звукового волнового файла, состоящего из чистого двоичного кода, в текстовый файл, содержащий текст.

RWN 28.05.2019 23:38

@RWN, тогда вы должны заметить, что если вы запишете эти строки в файл как есть, вы получите не текстовый файл, а просто копию волнового файла. Преобразование в «\ x» выполняется только функцией печати python, если вы используете функцию файлового класса write, она будет записывать байты в файл как есть.

Lev M. 29.05.2019 00:06

Нет такой вещи, как "текстовый файл" как таковой, есть просто "файлы", которые содержат потоки байтов. По соглашению мы называем файл «текстовым файлом», если он содержит только байты, которые можно интерпретировать как текст. Таким образом, если вы записываете двоичные (волновые) данные в файл, это будет волновой файл, а не текстовый файл.

Blorgbeard 29.05.2019 00:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда это возможно, байт в значении 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'*', как ключ/значение словаря?

RWN 28.05.2019 23:40

Я думаю, вы могли бы сказать это таким образом, да. \x.. используется только тогда, когда этот байт не соответствует печатному символу ASCII.

chepner 28.05.2019 23:43

Другие вопросы по теме