2013-03-11 57 views
2

我在Python這部分代碼:分裂的十六進制字符串成塊在Python

for line in response.body.split("\n"): 
    if line != "": 
     opg = int(line.split(" ")[2]) 
     opc = int(line.split(" ")[3]) 
     value = line.split(" ")[5] 
     if command == 'IDENTIFY': 
      if opg==opcodegroupr and opc==opcoder: 
       print line 
       ret['success'] = "IDENTIFY: The value is %s " % (value) 
       self.write(tornado.escape.json_encode(ret)) 
       self.finish() 

變量「線」被以這種方式製造:

1363005087 2459546910990453036 151 88 4 0x15000000 

每個字段是一個整數,但不是最後一個領域。最後一個字段是一個十六進制數字。

我會採取這個十六進制數字和每個字節分裂字節後。例如,我會認爲0x15000000被拆分爲15 00 00 00.

我該怎麼辦?我試着用value.encode(「十六進制」),但dowsn't工作正常...值是一個字符串?我不知道怎麼考慮這個變量..

+0

什麼是你想要做的十六進制值? – msvalkon 2013-03-11 12:46:28

+0

十六進制值是我的傳感器對我發送的某些命令的響應的有效載荷。有一些我想知道的信息,並在html頁面中打印給用戶。 – sharkbait 2013-03-11 12:53:26

回答

2

如果十六進制值已經是文本,你不需要做任何更多的轉換:

>>> text = "0x15000000" 
>>> text = text[2:] # remove literal type prefix 
>>> text = text.zfill(len(text) + len(text) % 2) # pad with zeros for even digits 
>>> ' '.join(text[i: i+2] for i in range(0, len(text), 2)) # split into 2-digit chunks 
'15 00 00 00' 

(每@tobias-k的建議修改有關零-padding)

+1

如果字符串有奇數個位置,請記住添加前導零;否則你會以「'12 34 5''爲結尾。 – 2013-03-11 13:01:51

+0

@tobias_k謝謝! – 2013-03-11 13:24:27

0
value = line.split(" ")[5] 

value是一個字符串,因爲你沒有轉換它。您可以使用int(value, 16)(例如,

>>> int('0x15000000', 16) 
352321536 
1

試試這個:

def split_hex(value): 
    value = value[2:] if len(value) % 2 == 0 else "0" + value[2:] 
    return " ".join(value[i:i+2] for i in range(0, len(value), 2)) 

注意,如果十六進制數是奇數的地方,我們必須添加一個前導零妥善它拆分成字節。

print split_hex("0x1234567") 
>>> 01 23 45 67 
相關問題