将bytearray转换为单独值的更快或更好的方法

时间:2016-03-28 15:15:03

标签: ctypes

我有一个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个这样的值。我读过一些关于“记忆视图”的内容?

任何?

1 个答案:

答案 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
相关问题