我有一个bytearray填充了“c-type”反向顺序数据,如sint32_t,但也有sint24_t。需要将24位有符号值转换为整数。 Python将负值作为带减号的值处理,c使用带符号的位来表示负值。
所以我首先将它改为32位:
raw = bytearray('\x89\x00\x23')
val = (ord(raw[0:1]) | (ord(raw[1:2])<<8) | (ord(raw[2:3])<<16) )
if ( (val & 0x00800000L) > 0):
val |= 0xFF000000L
但是现在我有一个32位的有符号值。我仍然需要它在python中成为负值。所以我想出了:
import ctypes
p_val = ctypes.c_int32(val).value
这将以正确的方式转换它。 我希望这会更高效,更快。有没有办法用更快的速度重写它。我需要每次迭代创建7个这样的值。我读过一些关于“记忆视图”的内容?
任何?
答案 0 :(得分:0)
各种选择:
import struct
MAX_INT24 = (1<<23)-1
BIAS_INT24 = (1<<24)
def int24(raw):
val = raw[0] | (raw[1] << 8) | (raw[2] << 16)
# val = struct.unpack('<i',raw + b'\x00')[0] # Another option
return val if val <= MAX_INT24 else val - BIAS_INT24
raws = [b'\xff\xff\x7f',
b'\xff\xff\xff',
b'\xfe\xff\xff']
for raw in raws:
print(int24(raw))
print(int.from_bytes(raw,'little',signed=True)) # Python 3 only
输出:
8388607
8388607
-1
-1
-2
-2