将字节数组转换为字符串而不解释字节?

时间:2009-12-16 19:10:03

标签: python bytearray decode

我有来自PDU编码短信的GSM日期/时间戳,其格式如此

\ X90,\ X21,\ X51,\ X91,\ X40,\ X33

格式化yy,mm,dd,hh,mm,ss

我已将它们从二进制文件读入字节数组。我想将它们转换为字符串,但没有做任何解码我想最终得到一个包含902151914033的字符串。然后我需要反转字符串中的每2个字符。

任何人都可以给我一些指示吗? 非常感谢

5 个答案:

答案 0 :(得分:5)

这应该让你开始:

>>> 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'

答案 1 :(得分:5)

要转换为十六进制:

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

要反转所有其他十六进制字符(如果我理解正确的话):

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

答案 2 :(得分:1)

你的意思是你想做一些处理!未处理的字节最容易表示为字符。

我认为你想要的是:

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

如果有必要,我肯定可以将其包含在匿名函数中。

答案 3 :(得分:0)

如果在您的问题中,您提供的字符串是包含\和的文字字节集(ascii),并且您希望将它们删除,您可以使用binascii模块和str.replace:

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

生成的平原字符串只包含数字。

答案 4 :(得分:0)

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))