Php 使用python将数组打包为16位字符串

Php 使用python将数组打包为16位字符串,php,python,Php,Python,我有一个数组,需要用python打包到16位深度 我一直在用php做这件事,没有任何问题。 数组就是这样的一大组数字-[1,2,3,4,5,700,540…] 使用php,我用一行代码完成此过程: $encoded_string = pack("s*", ...$array); // Done 看在上帝的份上,我想不出python是如何做到这一点的 我已经阅读了文档,我查看了示例,但我无法完成这项工作 我最好的是下面,它不工作在任何变化,我已经尝试 encoded_string = struc

我有一个数组,需要用python打包到16位深度

我一直在用php做这件事,没有任何问题。 数组就是这样的一大组数字-
[1,2,3,4,5,700,540…]
使用php,我用一行代码完成此过程:

$encoded_string = pack("s*", ...$array); // Done
看在上帝的份上,我想不出python是如何做到这一点的 我已经阅读了文档,我查看了示例,但我无法完成这项工作 我最好的是下面,它不工作在任何变化,我已经尝试

encoded_string = struct.pack('h', *array)

您必须对数组的每个成员调用
struct.pack

import struct

nums = [1, 2, 3, 4, 5, 700, 540]
as_bytes = [struct.pack('h', i) for i in nums]

# Produces
[b'\x01\x00', b'\x02\x00', b'\x03\x00', b'\x04\x00', b'\x05\x00', b'\xbc\x02', b'\x1c\x02', b'\x08\x00']
然后,如果需要,您可以加入到单字节字符串中:

>>> b''.join(as_bytes)
b'\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\xbc\x02\x1c\x02'
注意:还可以使用指定输出字节的对齐方式

Edit:@Proper提醒我,
struct.pack
的格式也支持指定目标压缩类型的数量,因此,通过使用格式说明符将数据长度包含在f字符串中,可以更轻松地完成此操作:

>>> struct.pack(f'{len(data)}h', *data)
b'\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\xbc\x02\x1c\x02'

谢谢你的回复b_c说实话,我对python恨之入骨,还有一个问题我必须解决,数组是在“分解”后创建为str而不是int的。所以它必须重新映射到int

您的代码确实有效,谢谢。 有一种方法可以用我的初始代码来实现,但是您必须定义要处理的值的数量。可以简单地对数组中的值进行计数,然后将其添加到数组中,使其自动化

data_array  = map(int,data)   # converts all values in the array to int
encoded_string = struct.pack('240s',*data_array) # 240 is number of values in the array

我也是最近与python合作的php开发人员,欢迎加入俱乐部。您可以尝试编写函数或找到替代方法,无论如何,查找一些信息我觉得python将太多发生的事情放在了代码结构之外。最后我觉得我不知道东西在哪里,而且我对代码的结构非常了解。我开始编写python是因为我对机器学习感兴趣,所以我别无选择。但信不信由你,我发现它真的是一种很好的脚本语言,只需要对那些用php、c/c++、java或任何类似语言“思考”的人进行一些练习。当然,你找不到在php下使用的一些好东西,但是把它添加到你熟悉的语言列表中还是有意义的。我也必须这样做,我只是不喜欢它的工作方式。例如,我需要导入整个库,而不是获取我喜欢的部分代码,只需在脚本运行之前导入300毫秒。有一行写着import X可以降低脚本的运行速度。显然,必须有解决方案,但默认情况下这是一个巨大的缺陷。我的脚本在php中运行10毫秒,在python中运行700毫秒,这简直是疯狂的好调用!我会更新我的答案,包括号码,我忘了这一切。