【问题标题】:Pack an array to 16bit stringwith python使用 python 将数组打包为 16 位字符串
【发布时间】:2019-11-05 20:35:48
【问题描述】:

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

我一直在用 php 做这件事,没有任何问题。 数组只是像这样的大量数字 - [1, 2, 3, 4, 5, 700, 540...] 使用 php,我在一行中完成了这个过程:

$encoded_string = pack("s*", ...$array); // Done

看在上帝的份上,我无法弄清楚在 python 中如何做到这一点 我已阅读文档,查看了示例,但无法完成 最好的我在下面,它在我尝试过的任何变体中都不起作用。

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

【问题讨论】:

  • 我也是php开发人员,最近在用python,欢迎加入俱乐部。你可以尝试编写函数或寻找替代方案,无论如何,请查看here以获取一些信息
  • 我觉得 python 将太多发生的事情放在代码结构之外。我最终觉得我不知道事情在哪里,而且我在代码的结构方面非常有空间。
  • 好吧,我开始编写python是因为我对机器学习感兴趣,所以我别无选择。但不管你信不信,我发现它真的是很好的脚本语言,只需要对那些用 php、c/c++、java 或任何类似语言“思考”的人进行一些练习。当然,你在 php 下找不到一些你使用的好东西,但将它添加到你熟悉的语言列表中仍然是有意义的
  • 我也必须这样做,我只是不喜欢它的工作原理。例如,我不必导入我喜欢的部分代码,而是必须导入整个库,并且在脚本运行之前导入需要 300 毫秒。一行写着 import X 可以减慢你的脚本我的秒数。显然必须有解决方案,但默认情况下它是一个巨大的缺陷。我的脚本在 php 中运行 10 毫秒,在 python 中运行 700 毫秒,这太疯狂了

标签: php python


【解决方案1】:

您必须在数组的每个成员上调用 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'

注意:您也可以使用endianness modifiers 指定输出字节的对齐方式。

编辑:@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'

【讨论】:

    【解决方案2】:

    感谢您的回复 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
    

    【讨论】:

    • 好电话!我将更新我的答案以包括数字,我完全忘记了。
    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多