在python中解压无符号短

Posted

技术标签:

【中文标题】在python中解压无符号短【英文标题】:Unpack unsigned short in python 【发布时间】:2018-10-15 01:01:01 【问题描述】:

我最近需要使用 Python 解码二进制文件。该文件包含用于存储我想要的“年”和“月”信息的无符号缩写。但奇怪的是:“年”存储为无符号短,大小为 2 个字节。 “月份”也存储为 unsigned short。但大小是 1 个字节。 (参见下面的文件结构)

问题是我可以使用 Python 的 unpack 方法来解码文件,但是 unsigned short 类型只接受 2 个字节的数据。那么如何解码“月份”信息?我应该使用其他技术吗?

import struct

with open("1.bin", "rb") as binary_file:
     a = struct.unpack('H',binary_file.read(2))
     print (type(a), a)            

【问题讨论】:

你在看this Performance Management thing吗?这些文档似乎没有意义。甚至还有一个毫秒字段记录为 unsigned char 类型,范围从 0 到 999。 圣人。你是?我可以要你的 lync 吗? 我刚刚用谷歌搜索了“下午录音修订”;我以前从未真正听说过这是什么东西。如果您希望我恰好是这件事上的超级方便专家,那么对不起。我不是。 【参考方案1】:

单字节无符号整数称为无符号字符。所以你应该可以用它来解码那个字节:

a = struct.unpack('B',binary_file.read(1))

或者,您可以像这样解压整个记录:

vals = struct.unpack('=HH5s13s5sHBBBB', binary_file.read(33))

或者像这样直接解压成命名变量:

len, typ, fver, pver, rev, year, month, day, hour, minute = \
    struct.unpack('=HH5s13s5sHBBBB', binary_file.read(33))

【讨论】:

非常感谢,伙计。但是年份存储为无符号短(2字节),为什么不使用struct.unpack('HH5s13s5sHBBBB',binary_file.read(33))?还有一个问题 对不起,错字了。我已经修好了。 谢谢,还有一个问题:如果我写“struct.unpack('HH5s13s5sHBBBB', binary_file.read(33))”,Phython 说:unpack 需要 34 字节的缓冲区。但是我们总共只有 32 个字节。 拆包多个项目时,还需要在模式的开头加上一个等号,告诉它使用每个项目的实际宽度,没有填充(参见关于“标准尺寸和对齐方式”的注释" 在docs.python.org/2/library/struct.html 的顶部)。我已经解决了。但是,如果您只有 32 个字节可供读取,那么您还有另一个问题,因为您显示的格式需要 33 个字节。

以上是关于在python中解压无符号短的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将有符号整数转换为无符号整数

在 python 中将 HEX 转换为无符号 INT16 [重复]

无符号字符*图像到 Python

SWIG C/python 和无符号字符指针

从“无符号”字节流中读取 32 位有符号值

从 numpy.uint8 数组中提取无符号字符