sim*_*onb 14 python file-io endianness
有没有一种简单的方法来读取这些整数?我更喜欢内置方法,但我认为可以使用一些位操作.
干杯
编辑
我想到了另一种方法,这与下面的方式不同,在我看来更清楚.它在另一端用零填充,然后移动结果.如果需要,则为否,因为使用msb最初的任何移动填充.
struct.unpack('<i','\0'+ bytes)[0] >> 8
Run Code Online (Sandbox Code Playgroud)
Mar*_*tos 13
Python的struct模块允许您将字节解释为不同类型的数据结构,并控制字节顺序.
如果您从文件中读取一个三字节数字,则可以将其转换为:
struct.unpack('<I', bytes + '\0')
Run Code Online (Sandbox Code Playgroud)
该模块似乎不支持24位字,因此'\0'-padding.
编辑:签名的数字比较棘手.您可以复制的高位,并设置高位到零,因为它移动到的4个字节的最高的地方(最后\xff有它):
struct.unpack('<i', bytes + ('\0' if bytes[2] < '\x80' else '\xff'))
Run Code Online (Sandbox Code Playgroud)
或者,对于python3(bytes是保留字,检查字节数组的字节给出int):
struct.unpack('<i', chunk + ('\0' if chunk[2] < 128 else '\xff'))
Run Code Online (Sandbox Code Playgroud)
您的24位整数是签名还是未签名?Bigendian还是littleendian?
struct.unpack('<I', bytes + '\x00')[0] # unsigned littleendian
struct.unpack('>I', '\x00' + bytes)[0] # unsigned bigendian
Run Code Online (Sandbox Code Playgroud)
签名有点复杂...如上所述获取无符号值,然后执行以下操作:
signed = unsigned if not (unsigned & 0x800000) else unsigned - 0x1000000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7495 次 |
| 最近记录: |