在Python

时间:2018-01-30 16:53:31

标签: python python-2.7 hex i2c

我正在使用i2c和Python 2.7。我有一个十六进制字符串,如下所示:

'\x80\x0A\x01\x0B\x99\x0C\x04\x0D\xCC'  

(写地址,寄存器,值,寄存器,值,寄存器,值,寄存器,值)

我需要使用前两个更改\ x04和\ xCC的值 最后两个十进制字符转换为十六进制。

a = 857
a = hex(a)
a
'0x359'
a = a[2:]
a
'359'
a = a.zfill(4)
a
'0359'
high = a[:2]
high
'03'
low = a[2:]
low
'59'

\x03需要进入\xCC点,\x59需要进入\x04点。

字符串需要如下所示:

'\x80\x0A\x01\x0B\x99\x0C\x59\x0D\x03'

我的第一个问题是让字符串像字符串一样运行。如果我使用 ' R'在字符串前面,然后使用str.replace(),结果字符串给我:

'\\x80\\x0A\\x01\\x0B\\x99\\x0C\\x59\\x0D\\x03'

我的设备没有回复。

如果我不使用“'”,我会:

  

ValueError:invalid \ x escape

当我尝试将字符串变为变量时。

我尝试过直接连接:

a = '\x80\x0A\x01\x0B\x99\x0C' + '\x' + low + '\x0D' + '\x' + high
  

ValueError:invalid \ x escape

a = '\x80\x0A\x01\x0B\x99\x0C' + r'\x' + low + r'\x0D' + r'\x' + high
a
'\x80\n\x01\x0b\x99\x0c\\x59\\x0D\\x03' (device does not respond)

a = '\x80\x0A\x01\x0B\x99\x0C\x' + low + '\x0D\x' + high
  

ValueError:invalid \ x escape

1 个答案:

答案 0 :(得分:0)

处理这些"字符串"作为字节数组,请尝试bytearray,如:

代码:

data = [int(x) for x in bytearray('\x80\x0A\x01\x0B\x99\x0C\x04\x0D\xCC')]
want = [int(x) for x in bytearray('\x80\x0A\x01\x0B\x99\x0C\x59\x0D\x03')]

num = 857
high, low = int(num / 256), num % 256

new_data = list(data)
new_data[data.index(int('cc', 16))] = high
new_data[data.index(int('04', 16))] = low

assert want == new_data

# convert back to string
result = ''.join(chr(d) for d in data)