Массив байтов в Python принимает только целые числа без знака - PullRequest
0 голосов
/ 03 мая 2018

Я работаю над аудиокодеками в Python (yikes), используя байтовые массивы для редактирования отдельных байтовых данных из аудиофайла.

Я имею в виду определенное шифрование, которое требует от меня выполнения побитовых операций над отдельными байтами, хранящимися в байтовом массиве.

Одной из этих операций является оператор ~ (поразрядно НЕ), который по существу инвертирует бит (b'0001 становится b'1110).

Проблема в том, что когда вы ссылаетесь на один элемент байтового массива, он возвращает целое число (по умолчанию Python рассматривает нетипизированные 8-битные целые числа данных?). Целые числа в Python по умолчанию подписаны (я не думаю, что целые числа без знака даже существуют в Python).

Когда вы пытаетесь выполнить побитовое НЕ для байта в байтовом массиве, вы получаете следующую ошибку:

>>> array[0] = ~array[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)

Это потому, что он ожидает неподписанного целого числа в диапазоне 0-255. Как преобразовать подписанное int в unsigned int, чтобы биты, используемые для представления обоих значений, оставались одинаковыми?

Приветствия

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Решение на самом деле удивительно просто, если немного поиграть с двоичным калькулятором.

Просто вычтите величину SIGNED int из 256, чтобы получить значение UNSIGNED int с тем же двоичным представлением.

Итак,

-23 подписано будет 233 без знака.

Надеюсь, это поможет любому, кто ищет решение :)

РЕДАКТИРОВАТЬ: Для тех, кто говорит, ответ 255 - array[0]. В этом случае я ищу способ перейти от сообщения NOT'd int к его неподписанному контрагенту. Итак, я уже выполнил побитовое НЕ для целого числа, теперь я просто возвращаю его обратно в форму, которую можно ввести в байтовый массив.

Так что в итоге это будет выглядеть примерно так:

tmp = ~array[0]
array[0] = 256 + tmp

или

array[0] = 256 - abs(tmp)

Это дает мне правильный ответ:)

0 голосов
/ 03 мая 2018

Используйте другую операцию для переключения битов.

например:. 1

array[i] = 255 - array[i]

или также:

array[i] = 255 ^ array[i]

перевернет все (т.е. 8) бит.


1 математика, стоящая за этим, может быть получена из дополнения до двух страница википедии.

...