它不是那么简单 - 是的,对于整数和简单数字,可以直接从命名元组打包到 struct 包提供的数据。
但是,您将数据保存为字符串,而不是数字 - 在端口的情况下转换为 int 是一件简单的事情 - 因为它是一个简单的整数,但在涉及 IP 时需要一些杂耍。
def ipv4_from_str(ip_str):
parts = ip_str.split(".")
result = 0
for part in parts:
result <<= 8
result += int(part)
return result
def ip_puerto_gen(list_of_ips):
for ip_puerto in list_of_ips:
yield(ipv4_from_str(ip_puerto.ip))
yield(int(ip_puerto.puerto))
def pack(list_of_ips):
return struct.pack(">" + "II" * len(list_of_ips),
*ip_puerto_gen(list_of_ips)
)
然后,您可以使用此处的“打包”功能来打包您似乎想要的结构。
但首先,尝试您错误地创建“listaPiers”这一事实(您的示例代码将因 IndexError 而失败) - 使用空列表,并在其上使用 append 方法插入具有 ip/port 对的新命名元组作为每个元素:
listaPiers = []
ipPuerto=collections.namedtuple('ipPuerto', 'ip, puerto')
for x in range(200):
new_element = ipPuerto("123.123.123.123", "8192")
listaPiers.append(new_element)
data = pack(listaPiers)