将转义字符连接到字符串 - Python

时间:2013-12-03 19:27:35

标签: python

我想将十六进制数字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”。

3 个答案:

答案 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)

您想查看chr内置函数。

v1 = chr(voltValues[0])

将v1设置为'\ x1e'。

如果您希望将其设为十六进制,则将voltValues [0]设置为0x30将产生'0'的v1。