将 2 个整数转换为 hex/byte 数组?
Convert 2 integers to hex/byte array?
我正在使用 Python 通过 SPI 传输两个整数(范围 0...4095)。该包似乎需要 [0xff,0xff,0xff]
形式的字节数组。
所以例如1638(十六进制:666)和 1229(十六进制:4cd)应该产生 [0x66,0x64,0xcd]
。
那么有效的转换看起来像中间的混合字节看起来很讨厌吗?
您可以通过左移然后将两个 12 位值按位或运算在一起并使用下面显示的 int_to_bytes()
函数来实现,该函数将在 Python 2.x.
在 Python 3 中,int
类型有一个名为 to_bytes()
的内置方法,可以执行此操作以及更多操作,因此在该版本中您无需提供你自己的。
def int_to_bytes(n, minlen=0):
""" Convert integer to bytearray with optional minimum length.
"""
if n > 0:
arr = []
while n:
n, rem = n >> 8, n & 0xff
arr.append(rem)
b = bytearray(reversed(arr))
elif n == 0:
b = bytearray(b'\x00')
else:
raise ValueError('Only non-negative values supported')
if minlen > 0 and len(b) < minlen: # zero padding needed?
b = (minlen-len(b)) * '\x00' + b
return b
a, b = 1638, 1229 # two 12 bit values
v = a << 12 | b # shift first 12 bits then OR with second
ba = int_to_bytes(v, 3) # convert to array of bytes
print('[{}]'.format(', '.join(hex(b) for b in ba))) # -> [0x66, 0x64, 0xcd]
我正在使用 Python 通过 SPI 传输两个整数(范围 0...4095)。该包似乎需要 [0xff,0xff,0xff]
形式的字节数组。
所以例如1638(十六进制:666)和 1229(十六进制:4cd)应该产生 [0x66,0x64,0xcd]
。
那么有效的转换看起来像中间的混合字节看起来很讨厌吗?
您可以通过左移然后将两个 12 位值按位或运算在一起并使用下面显示的 int_to_bytes()
函数来实现,该函数将在 Python 2.x.
在 Python 3 中,int
类型有一个名为 to_bytes()
的内置方法,可以执行此操作以及更多操作,因此在该版本中您无需提供你自己的。
def int_to_bytes(n, minlen=0):
""" Convert integer to bytearray with optional minimum length.
"""
if n > 0:
arr = []
while n:
n, rem = n >> 8, n & 0xff
arr.append(rem)
b = bytearray(reversed(arr))
elif n == 0:
b = bytearray(b'\x00')
else:
raise ValueError('Only non-negative values supported')
if minlen > 0 and len(b) < minlen: # zero padding needed?
b = (minlen-len(b)) * '\x00' + b
return b
a, b = 1638, 1229 # two 12 bit values
v = a << 12 | b # shift first 12 bits then OR with second
ba = int_to_bytes(v, 3) # convert to array of bytes
print('[{}]'.format(', '.join(hex(b) for b in ba))) # -> [0x66, 0x64, 0xcd]