2013-12-03 50 views
0

我想將十六進制數字hh與\ x連接起來,以創建一個字符串「\ xhh」,然後我將它放入一個列表並將其轉換爲一個長字符串。這是我當前的代碼,這引起了一個錯誤:將轉義字符連接到一個字符串 - Python

ValueError: invalid \x escape

這個錯誤對我來說很有意義,因爲我相信\ x具有以附加的東西爲計算機能夠識別它,我我不知道我該怎麼做。我想知道,會有像「\」+「x」+ hh這樣的工作,還有,這樣做更有效嗎?

這裏是我的代碼,因爲它代表的時候就引起了錯誤: (注 - 伏,CURR和校驗值不同我只是把示例值在此)

voltValues = [30, 30, 30] 
currValues = [30, 30, 30] 
checksumValues = [39, 33] 
v1 = "\x" + voltValues[0] 
v2 = "\x" + voltValues[1] 
v3 = "\x" + voltValues[2] 
c1 = "\x" + currValues[0] 
c2 = "\x" + currValues[1] 
c3 = "\x" + currValues[2] 
cs1 = "\x" + checksumValues[0] 
cs2 = "\x" + checksumValues[1] 

list = [ "\x01", "\x30", "\x53", v1, v2, v3, c1, c2, c3, "\x46", "\x46", "\x46", "\x30", "\x30", "\x30", "\x32", "\x46", "\x46", cs1, cs2, "\x0D" ] 
return ''.join(list) 

我希望它返回「\ x01 \ x30 \ x53 \ x30 \ x30 \ x30 \ x30 \ x30 \ x30 \ x46 \ x46 \ x46 \ x30 \ x30 \ x30 \ x32 \ x46 \ x46 \ x39 \ x33 \ x0D」。

+1

你應該知道,30和\ x30意味着不同的數字,你真的想混合它們嗎? – PasteBT

+0

你究竟想在這裏完成什麼?你知道'struct'模塊嗎? – geoffspear

回答

3

您可以通過說int(s, 16)將每個兩個字符的十六進制代碼s轉換爲一個整數並將chr()轉換爲一個字符來縮短整個過程的快捷方式。例如,chr(int('4A', 16))返回'J''\x'的嘗試級聯失敗,因爲十六進制代碼(如\xAA)在解釋器讀取時被解釋爲Python代碼本身的文字。

但順便說一句,你的程序中的伏特值不是以十六進制表示的。或者作爲字符串。以下都給予同樣的結果:

v = 0x4A # the proper way to write int literals in hex 
print chr(v) 

v = 74  # without the 0x, this is interpreted as decimal 
print chr(v) 

v = '4A' # in quotes, it can be anything you like, but then you need int(v,16) 
print chr(int(v, 16)) 
+0

這工作完美。謝謝!實際上,我的程序中有voltValues作爲字符串列表 - 我忘記將這些字符放入我在此處發佈的示例代碼中。 – user2933060

0

您想查看chr內置函數。

v1 = chr(voltValues[0]) 

將v1設置爲'\ x1e'。

如果你想要十六進制,那麼設置voltValues [0]到0x30將產生一個'0'的v1。

1

你擁有了它目前,Python是創造與價值「\ x」的字符串,然後的方式嘗試添加30到它(這將失敗,因爲這將是串聯一個str和一個int)。

你想要做什麼會是這樣的:

v1 = chr(int(str(voltValues[0]), 16)) 

這將首先從你的價值做出一個字符串,使INT()可以解析它。然後它在基數16處解析這個字符串(它將它解析爲十六進制數據)。之後,它會創建一個具有剛剛創建的整數編碼的字符串。這意味着e。 G。

>>> chr(0x30) 
'0' 
>>> "\x30" 
'0' 
>>> chr(0x41) 
'A' 
>>> "\x41" 
'A' 
相關問題