打包未对齐的字节

时间:2018-10-25 19:51:09

标签: python python-2.7 pack

我有一个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个字节吗?还是以某种方式在写出最后一个字节之前将其删除?

1 个答案:

答案 0 :(得分:1)

打包到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的内容符合预期:

enter image description here

(经过测试;此代码可在Python 2.7和3.6上使用。)