在 Python 中为 i2c 操作十六进制字符串
manipulating a hex string for i2c in Python
我正在使用 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'
我的设备没有响应。
如果我不使用 'r',我得到:
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
要将这些“字符串”作为字节数组处理,请尝试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)
我正在使用 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'
我的设备没有响应。
如果我不使用 'r',我得到:
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
要将这些“字符串”作为字节数组处理,请尝试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)