我的原始文件包含打包成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?
答案 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