如何使用结构体.在事先未定义要打包的数据和大小时打包



我需要从CSV文件动态生成二进制文件。

的例子:

CSV file:
#size, #data
1    , 0xAB
2    , 1234              (0x04D2)
5    , "ascii"           (0x6173636969)
1    , "x23"            (0x23)
Expected binary file:
'xABx04xD2x61x73x63x69x69x23'

数据可以是字符串、无符号整数或十六进制值。在我的程序中,我的进程如下:

  • 从CSV文件中读取size/data数据
  • 我使用eval函数获取数据值
  • 我使用Struct。生成输出数据的pack函数

问题是如何使用Struct。处理字符串或值的包函数

我试过了:

  • 检查isinstance(value, basestring)来处理字符串
  • 但我不知道如何处理在十六进制中定义的无符号值(但我不知道如何指定特殊大小的格式类型,例如:5字节)

我正在考虑将任何值放入十六进制字符串…

处理(字符串/无符号值到定义大小的二进制输出)最简单的方法是什么

如果遇到字符串,只需要使用encode从中获取字节字符串。如果遇到值,请尝试将其转换为以10或16为基数的int型,然后使用struct.pack:

formats = {
    1: "B",
    2: "H",
    4: "I",
    8: "Q"
}
def handle_value (size, value):
    try:
        value = int(value)
    except:
        try:
            value = int(value, 16)
        except:
            pass
    if type(value) == str:
        value = value[value.find('"') + 1, value.find('"') + 1 + size]
        value = value.encode("ascii") # or whatever encoding you want
    else:
        value = struct.pack(">" + formats[size], value)
    return value

然后读取整个文件:

output = bytes()
for line in files:
    size, value = line.split(",")
    size = int(size.strip())
    value = value.strip()
    output += handle_value(size, value)

Edit:我没有注意到您从CSV文件中获得大小,所以如果值是int,则可以从此大小推断出您想要的格式。

最新更新