2009-12-16 93 views
0

我具有从PDU编码SMS一个GSM日期/时间戳它被格式化为这样将字节数组转换为字符串而不解释字节?

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

格式YY,毫米, dd,hh,mm,ss

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

任何人都可以给我一些指针吗? 很多谢谢

+0

因此,在您的输入中,0x90或'\ x90'代表年份(20)09,0x21代表月份12,0x51代表第15天等等。什么聪明的想法设计了编码方案? – 2009-12-16 21:53:14

回答

1

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

我想你想要的是沿着线的东西:

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

,我相信可以在一个匿名函数,包裹起来,如果必要的。

+0

@Autopulated:修正了第一个问题的答案,''\ x90''是'chr(0x90)'而不是'chr(90)'。 LC解决方案虽然更好。 – RedGlyph 2009-12-16 19:43:53

+0

啊,谢谢,忘了它是十六进制:) – James 2009-12-16 20:07:19

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

要转换为十六进制:

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

为了扭转每隔十六进制字符(如果我理解正确):

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

+0

最新的Python有一个更好的(IMO)字符串格式:http://www.python.org/dev/peps/pep-3101/ – 2009-12-16 19:45:13

+0

@lpthnc:味道的问题,真的。尽可能保持简单和可读性:-) – RedGlyph 2009-12-16 19:46:53

0

如果在你身上R第,你提供的字符串是字面组的字节(如ASCII)包括\和,和要剥离出来则可以使用binascii模块和str.replace:

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

所得平原字符串将只包含数字。

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)) 
相关问题