我想将十六进制数字hh与\ x连接,以创建一个字符串“\ xhh”,然后将其放入列表并将其转换为长字符串。这是我当前的代码,它引发了一个错误:
ValueError:invalid \ x escape
这个错误对我来说很有意义,因为我认为\ x必须附加到某些东西上才能让计算机识别它,而我不知道我该怎么做。我想知道,像“\”+“x”+ hh这样的工作,还有,有更有效的方法吗?
这是我的代码,因为它导致了错误: (注意 - 伏特,电流和校验和值会有所不同。我只是为此设置了示例值)
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”。
答案 0 :(得分: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))
答案 1 :(得分:1)
当前的方式,Python正在创建一个值为“\ x”的字符串,然后尝试向其添加30(这将失败,因为这将连接str和int)。
你想做的事情是这样的:
v1 = chr(int(str(voltValues[0]), 16))
这将首先从您的值创建一个字符串,以便int()可以解析它。然后它在基数16处解析该字符串(它将其解析为十六进制数据)。之后,它会创建一个字符串,其中包含您刚刚创建的整数的编码。这意味着e。克。
>>> chr(0x30)
'0'
>>> "\x30"
'0'
>>> chr(0x41)
'A'
>>> "\x41"
'A'
答案 2 :(得分:0)