我使用matlab将单值( val = 2 )写为24位数据:
fid = fopen('.\t1.bin'), 'wb');
fwrite(fid, val, 'bit24', 0);
在bin查看器中,我可以看到数据(值2)存储为02 00 00。 我需要在python中将值读为单个整数。 我的代码不起作用:
struct_fmt = '=xxx'
struct_unpack = struct.Struct(struct_fmt).unpack_from
with open('.\\t1.bin', mode='rb') as file:
fileContent = file.read()
res = struct_unpack(fileContent)
我也试过
val = struct.unpack('>I',fileContent)
但它给出了错误:
unpack需要长度为4的字符串参数
我做错了什么?
由于
sedy
答案 0 :(得分:5)
在Python struct module format characters中,x
被定义为填充字节。你在那里的格式字符串表示读取3个字节然后丢弃它们。
还没有处理24位数据的格式说明符,所以自己构建一个:
>>> def unpack_24bit(bytes):
... return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16)
...
>>> bytes
'\x02\x00\x00'
>>> unpack_24bit(struct.unpack('BBB', bytes))
2
答案 1 :(得分:2)
通过访问单个字节,您始终可以将整数转换为字节,反之亦然。只需照顾字节序。
下面的代码使用随机整数转换为24位二进制并返回。
import struct,random
# some number in the range of [0, UInt24.MaxValue]
originalvalue = int (random.random() * 255 ** 3)
# take each one of its 3 component bytes with bitwise operations
a = (originalvalue & 0xff0000) >> 16
b = (originalvalue & 0x00ff00) >> 8
c = (originalvalue & 0x0000ff)
# byte array to be passed to "struct.pack"
originalbytes = (a,b,c)
print originalbytes
# convert to binary string
binary = struct.pack('3B', *originalbytes)
# convert back from binary string to byte array
rebornbytes = struct.unpack('3B', binary) ## this is what you want to do!
print rebornbytes
# regenerate the integer
rebornvalue = a << 16 | b << 8 | c
print rebornvalue