преобразовать массив байтов в строку без интерпретации байтов? - PullRequest
0 голосов
/ 16 декабря 2009

У меня есть отметка даты / времени GSM из SMS, закодированного PDU, она отформатирована следующим образом:

\ x90 \ x21 \ x51 \ x91 \ x40 \ x33

формат гг, мм, дд, чч, мм, сс

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

Кто-нибудь может дать мне несколько советов? Большое спасибо

Ответы [ 5 ]

5 голосов
/ 16 декабря 2009

Это должно помочь вам начать:

>>> s = b'\x90\x21\x51\x91\x40\x33'
>>> lst = [hex(z)[2:] for z in s]
>>> lst
['90', '21', '51', '91', '40', '33']

>>> string = ''.join(hex(z)[3:1:-1] for z in s)
>>> string
'091215190433'
5 голосов
/ 16 декабря 2009

Для преобразования в гекс:

hexdata = ''.join('%02x' % ord(byte) for byte in bindata)

Чтобы поменять местами все остальные шестнадцатеричные символы (если я правильно понимаю):

hexdata = ''.join(('%02x' % ord(byte))[::-1] for byte in bindata)

1 голос
/ 16 декабря 2009

То, что вы имеете в виду, это то, что вы делаете хотите выполнить некоторую обработку! Необработанные байты легче всего представить в виде символов.

Я думаю, что вы хотите что-то вроде:

r = ''
for num in array:
    r += '%2X' % num
return r

Который, я уверен, может быть обернут в анонимную функцию, если это необходимо.

0 голосов
/ 29 декабря 2009
switcher= dict(
    (n1*16 + n2, n2*16 + n1)
    for n1 in range(16)
    for n2 in range(16)
)

def nibble_switcher(bindata):
    return type(bindata)(switcher[i] for i in bindata)
    # will work with many types, not only bytearray

def nibble_switcher_as_hex_string(bindata):
    return ''.join("%02x" % i for i in nibble_switcher(bindata))
0 голосов
/ 16 декабря 2009

Если в вашем вопросе указанная вами строка является буквенным набором байтов (ascii), включая \ and, и вы хотите удалить их, вы можете использовать модуль binascii и str.replace:

import binascii
qp = binascii.b2a_qp( bunchabytes )
plainstring = qp.replace( '\\x', '' ).replace( ',', '' )

Результирующая обычная строка будет состоять только из цифр.

...