【问题标题】:manipulating a hex string for i2c in Python在 Python 中为 i2c 操作十六进制字符串
【发布时间】:2018-01-30 16:53:30
【问题描述】:

我正在使用 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: 无效的 \x 转义

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

我尝试了直接连接:

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

ValueError: 无效的 \x 转义

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: 无效的 \x 转义

【问题讨论】:

    标签: python python-2.7 hex i2c


    【解决方案1】:

    要将这些“字符串”作为字节数组处理,请尝试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)
    

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 2019-02-21
      • 2014-11-16
      • 2019-07-27
      • 2014-05-01
      • 2023-04-08
      • 2017-01-02
      • 1970-01-01
      相关资源
      最近更新 更多