Python 如何在数据和要打包的大小事先未定义的情况下使用struct.pack

Python 如何在数据和要打包的大小事先未定义的情况下使用struct.pack,python,struct,pack,Python,Struct,Pack,我需要从CSV文件动态生成一个二进制文件 例如: CSV file: #size, #data 1 , 0xAB 2 , 1234 (0x04D2) 5 , "ascii" (0x6173636969) 1 , "\x23" (0x23) Expected binary file: '\xAB\x04\xD2\x61\x73\x63\x69\x69\x23' 数据可以是字符串、无符号整数或十六进制值。

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

例如:

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

Expected binary file:
'\xAB\x04\xD2\x61\x73\x63\x69\x69\x23'
数据可以是字符串、无符号整数或十六进制值。 在我的计划中,我的过程如下:

  • 我从CSV文件中读取大小/数据
  • 我使用
    eval
    函数获取数据值
  • 我使用Struct.pack函数生成输出数据
问题是如何使用Struct.pack函数来处理字符串或值

我试过这个:

  • 检查isinstance(值、基字符串)以处理字符串
  • 但我不知道如何处理十六进制定义的无符号值(但我不知道如何为特殊大小指定格式类型,例如:5字节)
我正在考虑将任何值放入十六进制字符串中


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

如果遇到字符串,只需使用
encode
从中获取字节字符串。如果遇到值,请尝试将其转换为以10或16为基数的整数,然后使用
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)

编辑:我没有注意到您从CSV文件中获取了大小,因此如果值为int,您可以从该大小推断出所需的格式。

您可以将无符号数字拆分为正常大小,例如:5字节=1+4字节。Thx对于答案,这看起来与我现在所做的非常类似。但我发现它相当。。。“肮脏”。也许将无符号值转换为十六进制字符串是一种可行的方法。