Ошибка chr (n), когда n превышает 256 - PullRequest
1 голос
/ 27 августа 2011

Я использую chr и int для преобразования строки двоичного представления в реальное двоичное значение.

То, что я сделал, это

   n=int('0101011',2)
   binary=chr(n)

Тогда binary - это действительное двоичное значение строки представления.

Но что если строка, которую я передал int, будет больше 256 в десятичном виде?

Есть решение?

PS: Причина, по которой я использую chr, заключается в том, что я хочу преобразовать n в строку, чтобы я мог записать ее в файл, используя f.write().

И этот вопрос возник из этот вопрос

Ответы [ 4 ]

8 голосов
/ 27 августа 2011

chr() определяется как работающий с символами ASCII, значение которых должно быть меньше 256.Если вы ожидаете символы Юникода, вы можете использовать unichr().

1 голос
/ 27 августа 2011

Вы можете использовать различные символы формата в строке формата, заданной методу pack() в модуле struct, чтобы легко получить соответствующую строку двоичного представления целых чисел со знаком или без знака длиной от 1 до 8 байтов.

>>> from struct import pack
>>> pack('B', 255)
'\xff'
>>> pack('H', 257)
'\x01\x01'
>>> pack('Q', 9223372036854775807)
'\xff\xff\xff\xff\xff\xff\xff\x7f'

Возвращенное значение может быть записано в файл с помощью f.write(), если необходимо.При чтении или записи двоичных данных в файл вы должны добавить 'b' к значению аргумента mode при open() файле.

0 голосов
/ 09 декабря 2017

При попытке конвертировать значения в юникоде вы можете столкнуться с множеством проблем.Таким образом, использование unichr также не всегда возможно, например:

>>> n = int('0001f600', 16)
>>> unichr(n)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: unichr() arg not in range(0x10000) (narrow Python build)

Обратите внимание на сообщение narrow Python build в сообщении об ошибке, это означает, что Python был построен без поддержки широких символов Юникода, но даже узкий Python может получитьвокруг этого ограничения (без необходимости перекомпиляции с флагом --enable-unicode=ucs4):

>>> n = int('0001f600', 16)
>>> s = '\\U{:0>8X}'.format(n)
>>> s
'\\U0001F600'
>>> binary = s.decode('unicode-escape')
>>> print(binary)
?
0 голосов
/ 27 августа 2011

Если я понимаю ваш вопрос, вы хотите преобразовать двоичную строку в целочисленное значение. Это то, что вы делаете в первой строке кода. Вторая строка просто преобразует целочисленное значение в символ, представленный этим значением в таблице ASCII. Так, например, если строка 01100001, которая будет преобразована в значение int 97 на первом шаге. Затем второй шаг преобразует 97 в ASCII символ «а». Если вы затем попытаетесь использовать эту переменную в качестве числа, она будет преобразована обратно в значение ing, равное 97. Итак, если я понимаю ваш вопрос, у вас действительно будет желаемое число после шага 1.

...