如何从32位解释(读取)带符号的24位数据

时间:2016-07-29 07:36:51

标签: python

我的原始文件包含打包成32位的带符号的24位数据 例如:

00 4D 4A FF 
00 FF FF FF

我想读取这些数据并获得[-2 ^ 23和2 ^ 23-1]之间的有符号整数

现在我写

  int32_1 = file1.read(4)
  val1 = (( unpack('=l', int32_1)[0] & 0xFFFFFF00)>>8

但如何将2补语考虑为{1}}为-1?

2 个答案:

答案 0 :(得分:2)

您的代码使事情变得比他们需要的更复杂。但是,您确实应该在unpack格式字符串中正确指定字节序类型。

from binascii import hexlify
from struct import unpack

data = ('\x00\x03\x02\x01', '\x00\x4D\x4A\xFF', '\x00\xFF\xFF\xFF')

for b in data:
    i = unpack('<l', b)[0] >> 8
    print hexlify(b), i

<强>输出

00030201 66051
004d4aff -46515
00ffffff -1

FWIW,这是一个适用于Python 3或Python 2的版本; Python 3中的输出略有不同,因为Python 3中的普通字符串是Unicode;字节字符串是&#34;特殊&#34;。

from __future__ import print_function
from binascii import hexlify
from struct import unpack

data = (b'\x00\x03\x02\x01', b'\x00\x4D\x4A\xFF', b'\x00\xFF\xFF\xFF')

for b in data:
    i = unpack('<l', b)[0] >> 8
    print(hexlify(b), i)    

Python 3输出

b'00030201' 66051
b'004d4aff' -46515
b'00ffffff' -1

这是一个只在Python 3上运行的版本:

from binascii import hexlify

data = (b'\x00\x03\x02\x01', b'\x00\x4D\x4A\xFF', b'\x00\xFF\xFF\xFF')

for b in data:
    i = int.from_bytes(b[1:], 'little', signed=True)
    print(hexlify(b), i)

答案 1 :(得分:1)

你可以向左移8位,将结果作为有符号的32位整数(使用ctypes库),然后除以256

>>> import ctypes
>>> i = 0x00ffffff
>>> i
16777215
>>> i<<8
4294967040
>>> ctypes.c_int32(i<<8).value
-256
>>> ctypes.c_int32(i<<8).value//256
-1