python struct.pack():在列表或元组中打包多个数据

时间:2016-01-14 16:25:57

标签: python list struct

假设我有tuplelong long个包含x = [12974658, 638364, 53637, 63738363] 类型的数字,

struct.pack

如果想单独struct.pack('<Q', 12974658) ,我必须使用

struct.pack('<4Q', 12974658, 638364, 53637, 63738363)

或者如果我想将其作为多个,那么我必须像这样明确地提到它

list

但是,如何在tuple语句中的struct.packfor中插入项目。我尝试使用这样的struct.pack('<4Q', ','.join(i for i in x)) 循环。

expected string, int found

收到错误int,因此我将包含str类型的列表转换为binary_data = '' x = [12974658, 638364, 53637, 63738363] for i in x: binary_data += struct.pack('<Q', i) ,现在打包它们要复杂得多。因为整个列表被转换为字符串(就像一个句子)。

截至目前我正在做一些像

这样的事情
struct.unpack('<4Q', binary_data)

我打开它们就像

一样
list

我的问题:有更好的方法,我可以直接在tuple语句中指向struct.packGson gson = new GsonBuilder().create(); Type type = new TypeToken<Map<String, String>>(){}.getType(); //or use type of object of your JSON Map<String, String> map = gson.fromJson(yourString, type); String accessToken = map.get("access_token"); ,或者可能是一个班轮?

1 个答案:

答案 0 :(得分:9)

你可以splat,对不起“解压参数列表”:

>>> struct.pack("<4Q", *[1,2,3,4])
'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'

如果列表的长度是动态的,您当然也可以在运行时构建格式字符串:

>>> x = [1, 2] # This could be any list of integers, of course.
>>> struct.pack("<%uQ" % len(x), *x)
'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00'