打包未对齐的字节

Packing unaligned bytes

我有一个 Perl 脚本,它创建一个二进制输入文件,我们将其传递给另一组代码。二进制输入文件包含数百个不同长度的参数。大多数是 8、16 或 32 位。我正在尝试将 Perl 脚本转换为 Python,让我感到困惑的是几个 24 位长的参数。

我看了this forum post,很接近,但不是我需要的。

例如。假设输入值是一个整数 (10187013)。我如何将其打包成 3 个字节?如果我这样做:

    hexVars  = struct.pack("<L", 10187013)

然后写入二进制文件:

    binout = open(binFile, "wb")
    binout.write(hexVars)

不出所料,打印出四个字节05 71 9b 00,我要的是05 71 9b。我可以强制它只打包 3 个字节吗?或者以某种方式在写出之前删除最后一个字节?

打包成一个 L 总是给你 4 个字节——因为那是 L 的意思。使用 3 个单独的变量(每个变量 1 个字节),或者,由于您无论如何都要转换为字符串,所以只需删除第四个未使用的字节:

import struct
hexVars  = struct.pack("<L", 10187013)[:3]
print (len(hexVars))
print (ord(hexVars[0]),ord(hexVars[1]),ord(hexVars[2]))
binout = open('binFile', "wb")
binout.write(hexVars)

binFile 的内容符合预期:

(已测试;此代码适用于 Python 2.7 和 3.6。)