Преобразование непечатаемых байтов в строку - PullRequest
0 голосов
/ 04 августа 2020

У меня есть объект python3 bytes (сгенерированный с использованием struct.pack или to_bytes), который я хочу преобразовать в объект str. Обратите внимание, что использование bytes.encode("ascii") здесь не работает, потому что оно откажется от преобразования непечатаемых символов.

Как я могу это сделать?

Я пытаюсь преобразовать целое число в двоичное представление в объекте str, так что 11 будет представлен как "\x00\x00\x00\x0b" (обратите внимание, что это объект str, а не bytes).

То, что я сейчас делаю, работает хорошо для младших целых чисел, у которых нет байтов 0x80 или выше:

In [94]: i = 11

In [95]: i.to_bytes(2, 'big')
Out[95]: b'\x00\x0b'

In [96]: i.to_bytes(2, 'big').decode('ascii')
Out[96]: '\x00\x0b'

Однако он разбивается для целых чисел, которые будут представлены с использованием MSbit байта:

In [97]: i = 250

In [98]: i.to_bytes(2, 'big')
Out[98]: b'\x00\xfa'

In [99]: i.to_bytes(2, 'big').decode('ascii')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-100-d5fe6014b48a> in <module>
----> 1 i.to_bytes(2, 'big').decode('ascii')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xfa in position 1: ordinal not in range(128)

Как преобразовать i = 250 в "\x00\xfa"?

Спасибо!

PS

Причина в том, что функция, которую я хочу вызвать, ожидает str объект, а не объект bytes, я понимаю, что это не намеченная цель объектов pyton3 str (и ценю разделение между str и bytes), однако это все еще то, что я sh хочу выполнено sh здесь.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

как насчет форматирования строкового представления (без декодирования в символы!) Байтов?

import struct

i = 250
s = str(struct.pack('>H', i)).replace('b', '').replace("'", "")

print(s)
>>> \x00\xfa
1 голос
/ 04 августа 2020

Думаю, это то, что вам нужно:

def int_to_str_bytes(i: int) -> str:
    return chr(i//256) + chr(i%256)

>>> to_str_bytes(250)  # "\x00ú"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...