【问题标题】:Creating 16 and 24-bit integers from binary file从二进制文件创建 16 位和 24 位整数
【发布时间】:2013-02-12 19:20:38
【问题描述】:

我正在修改一个现有的读取二进制文件的 Python 应用程序。文件的格式发生了一些变化。目前,一个字段被定义为记录的 35-36 字节。规范还声明“......记录中的字段将是用 ASCII 编写的字符字段。”这是当前工作代码的样子:

def to_i16( word ):
    xx = struct.unpack( '2c', word )
    xx = ( ord( xx[ 0 ] ) << 8 ) + ord( xx[ 1 ] )

    return xx

val = to_i16( reg[ 34:36 ] )

但是该字段被重新定义为字节 35-37,因此它将是一个 24 位值。我讨厌使用二进制文件,并且对比特玩弄很可怕。如何将该 3 字节值转换为 24 位整数?我尝试了一些通过谷歌搜索找到的代码位,但我认为它们不正确。很难确定,因为我仍在等待发送示例“新格式”文件的人向我发送显示我应该提出的值的文本表示形式。

【问题讨论】:

    标签: python binaryfiles


    【解决方案1】:

    只需读取 24 位(我假设在 big endian,因为原始代码也是这种格式):

    val = struct.unpack('>I', b'\x00' + reg[34:37])
    

    【讨论】:

    • 我复制/粘贴了它,但遇到语法错误。我正在使用 Python v2.4,如果这很重要的话。
    • 如果我将 b'\x00' 更改为 '\x00',它会工作并产生与 ( ord( xx[ 0 ] ) &lt;&lt; 16 ) + ( ord( xx[ 1 ] ) &lt;&lt; 8 ) + ord( xx[ 2 ] ) 相同的值。
    • @DaveKub 是的,在 2.4 中,您需要省略前导 b。请注意,2.4 已完全过时且不受支持,因此您可能需要考虑更新。
    • 是的,我知道它已经过时了。但不幸的是,这是服务器上的工作内容,我无法控制它。谢谢!
    • 对于有符号值,请尝试:val = struct.unpack('&gt;i', reg[34:37]+'\x00')[0] &gt;&gt; 8
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2021-02-11
    • 2018-11-25
    • 1970-01-01
    • 2016-11-13
    • 2011-08-31
    相关资源
    最近更新 更多