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

Python 如何从32位解释(读取)有符号24位数据,python,Python,我有一个原始文件,包含有符号的24位数据,打包成32位 例如: 我想读取这些数据并得到介于[-2^23和2^23-1]之间的有符号整数 现在我写作 int32_1 = file1.read(4) val1 = (( unpack('=l', int32_1)[0] & 0xFFFFFF00)>>8 但是如何考虑2-补码来将00FFFFFF解释为-1?您可以向左移动8位,将结果作为有符号32位整数(使用ctypes库),然后除以256 >>> imp

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

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

现在我写作

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

但是如何考虑2-补码来将
00FFFFFF
解释为-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
>>导入ctypes
>>>i=0x00ffffff
>>>我
16777215

>>>i>ctypes.c_int32(i>ctypes.c_int32)(i您的代码使事情变得比需要的更复杂。但是,您确实应该在
unpack
格式字符串中正确指定endian类型

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

FWIW,这是一个在Python3或Python2中工作的版本;输出在Python3中略有不同,因为Python3中的普通字符串是Unicode;字节字符串是“特殊的”

下面是一个仅在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)

您使用的是Python 2还是Python 3?您的数字是大端的,即
004d4af
的十进制值是否为5065471?我使用的是Python 2.7和小端的。我正在使用Windows1064bitsah,好的。因此
004d4af
应该是-46515。FWIW,这在Python 3中非常简单:
int.from_字节(b[1:],'little',signed=True)
00030201 66051
004d4aff -46515
00ffffff -1
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)    
b'00030201' 66051
b'004d4aff' -46515
b'00ffffff' -1
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)