Python中如何使用struct库打包IPv6地址及多类型混合数据
解决方案
你需要将IPv6文本地址先转换为16字节的二进制格式,再使用16s作为格式符完成打包,具体说明如下:
- 没有直接匹配IPv6文本字符串的C类型格式符,必须先使用
socket模块的inet_pton方法把IPv6文本串转为16字节原生二进制地址,不能直接把IPv6文本字符串传入struct.pack,否则得到的是文本的ASCII编码值,不是标准IPv6二进制地址格式。 - 格式串中的
?需要替换为16s,该格式符表示匹配长度为16的字节序列,刚好符合IPv6地址16字节的长度要求。 - 如果需要避免结构体默认字节对齐产生的填充字节,建议在格式串开头添加字节序标识:
!代表网络字节序(大端),适合网络传输场景<代表小端字节序,适合本机小端设备使用场景
完整示例代码
import struct import socket Value1 = 0 Value2 = 3.10 IPv6_text = '2001::1' # 将IPv6文本转为16字节二进制地址 ipv6_bin = socket.inet_pton(socket.AF_INET6, IPv6_text) # 定义格式串,网络字节序下总长度为4+4+16=24字节 pack_format = '!i f 16s' # 执行打包 package = struct.pack(pack_format, Value1, Value2, ipv6_bin)
内容的提问来源于stack exchange,提问作者Wyrox51
相关产品推荐
相关产品推荐

