gpt4 book ai didi

python - 如何用Python将不同类型的数据一起打包成二进制数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:32 24 4
gpt4 key购买 nike

假设有一个用户定义的协议(protocol)如下:

The protocol:

------------- ------------- ---------------- -----------------
| Seqno. | ip | port | user name |
| int, 4 bytes| int, 4 bytes| short, 2 bytes | string, 50 bytes|


the [user name] field stores a string ending with zero,
if the string length is less than 50 bytes, padding with zeros.

通常我会将这些字段用C语言打包成这样:

//Pseudo code
buffer = new char[60];
memset(buffer, 0, 60);

memcpy(buffer, &htonl(Seqno), 4);
memcpy(buffer+4, &htonl(ip), 4);
memcpy(buffer+4, &htons(port), 2);
memcpy(buffer+2, Usrname.c_str(), Usrname.length() + 1);

但是我们如何在python中打包协议(protocol)数据呢?我是 python 新手。

最佳答案

使用 struct module :

import struct

binary_value = struct.pack('!2IH50s', seqno, ip, port, usrname)

这会将 2 个 4 字节无符号整数、一个 2 字节无符号短整数和一个 50 字节字符串打包成 60 个字节,并采用网络(大端)字节顺序。该字符串将用空值填充以弥补长度:

>>> import struct
>>> seqno = 42
>>> ip = 0xc6fcce10
>>> port = 80
>>> usrname = 'Martijn Pieters'
>>> struct.pack('!2IH50s', seqno, ip, port, usrname)
'\x00\x00\x00*\xc6\xfc\xce\x10\x00PMartijn Pieters\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Python 的字符串表示对 ASCII 可打印范围内的任何字节使用 ASCII 字符,对大多数其他字节点使用 \xhh,因此 42 变成了 \x00\x00\x00*.

关于python - 如何用Python将不同类型的数据一起打包成二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com