在 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)
我只是 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)