在 Python 中连接两个十六进制整数

Join two hex integers in Python

我只是 Python 的新手,目前正在 Raspberry Pi 上使用 I2C 从数字罗盘读取 2 个字节。 MSB 和 LSB 值存储在数组中,例如
a = [0x07, 0xFF]

我想将这两个字节连接成一个变量,例如
b == 0x07FF

我该怎么做?
我认为这就像将 MSB 乘以 256 并将其添加到 LSB 一样简单,但我一直得到 "IndexError: list index out of range"
对此的任何帮助将不胜感激:)

我的代码是:

import smbus
import time

bus = smbus.SMBus(1)

addr = 0x1E

bus.write_byte_data(addr, 0x00, 0x70)
bus.write_byte_data(addr, 0x01, 0xA0)
bus.write_byte_data(addr, 0x02, 0x00)
time.sleep(0.006)

for i in range(0,10):
    x = bus.read_i2c_block_data(addr,0x03,2)
    y = bus.read_i2c_block_data(addr,0x07,2)
    z = bus.read_i2c_block_data(addr,0x05,2)

    xval = 256*x[2]+x[1]
    print x, y, z
    print xval
    time.sleep(1)
print 'exiting...'

我得到的错误是:

Traceback (most recent call last):
  File "compass2.py", line 18, in <module>
    xval = 256*x[2]+x[1]
IndexError: list index out of range

如评论中所述,在 Python 中,索引从 0 开始,而不是 1。在您的代码中,从 x[0] 开始,而不是 x[1]

合并从 0 到 255 的两个整数:

按位使用

来源:this answer

MAXINT = 255  # Must be a power-of-two minus one
NUM_BITS = MAXINT.bit_length()

def merge(a, b):
    c = (a << NUM_BITS) | b
    return c

def split(c):
    a = (c >> NUM_BITS) & MAXINT
    b = c & MAXINT
    return a, b

# Test:
EXPECTED_MAX_NUM_BITS = NUM_BITS * 2
for a in range(MAXINT + 1):
    for b in range(MAXINT + 1):
        c = merge(a, b)
        assert c.bit_length() <= EXPECTED_MAX_NUM_BITS
        assert (a, b) == split(c)

使用算术

此技术有效但不是首选。

MAXINT_PLUS1 = 256

def merge(a, b):
    c = MAXINT_PLUS1 * a + b
    return c

def split(c):
    a, b = divmod(c, MAXINT_PLUS1)
    return a, b

# Test:
EXPECTED_MAX_NUM_BITS = (MAXINT_PLUS1 - 1).bit_length() * 2
for a in range(MAXINT_PLUS1):
    for b in range(MAXINT_PLUS1):
        c = merge(a, b)
        assert c.bit_length() <= EXPECTED_MAX_NUM_BITS
    assert (a, b) == split(c)