打包未对齐的字节
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。)
我有一个 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。)