2009-12-16 90 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)) 
相關問題