gpt4 book ai didi

php - 在 python 中使用 struct 模块在 pack() 中选择格式

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:29 29 4
gpt4 key购买 nike

我正在尝试将 PHP 代码转换为 python。

所有值均按网络字节顺序(大端)发送。

基本上,协议(protocol)规范中的REQUEST是

enter image description here

响应是

enter image description here

对应的PHP代码(corresponding DOC)是:

$transaction_id = mt_rand(0,65535);
$current_connid = "\x00\x00\x04\x17\x27\x10\x19\x80";
$fp = fsockopen($tracker, $port, $errno, $errstr);
$packet = $current_connid . pack("N", 0) . pack("N", $transaction_id);
fwrite($fp,$packet);

我试图在 python 中找到相应的代码 ( for doc ):

transaction_id = random.randrange(1,65535)
packet = "\x00\x00\x04\x17\x27\x10\x19\x80"
packet = packet + struct.pack("i", 0) + struct.pack("i", transaction_id)
clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
clisocket.sendto(packet, ("tracker.istole.it", 80))

在响应中,我应该得到与我在请求中发送的相同的 transaction_id,但我没有得到。所以,我的猜测是,我没有使用正确的格式打包。

此外,python 的文档不如 PHP 的文档清晰。该协议(protocol)指定使用 Big Endian 格式,PHP 文档清楚地说明了哪些格式适用于 Big-Endian。

遗憾的是,我无法理解在 python 中使用哪种格式。请帮助我选择正确的格式。

编辑:没有得到任何回应,所以我会说更多。

import struct
import socket
import random

clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
packet = "\x00\x00\x04\x17\x27\x10\x19\x80"
transaction_id = random.randrange(1,65535)
print transaction_id
packet = packet+struct.pack(">i", 0)
packet = packet+struct.pack(">i", transaction_id)

clisocket.sendto(packet, ("tracker.istole.it", 80))
res = clisocket.recv(16)

print struct.unpack(">i", res[12:16])

根据协议(protocol)规范,我应该返回相同的 INTEGER。

最佳答案

php pack function格式 N 表示无符号 32 位大端整数。对应的Python struct.pack格式为 >L

您为协议(protocol)发布的图像显示 connection_id 应该是 64 位(无符号)整数:Python struct.pack 格式 Q

所以:

clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
connection_id=0x41727101980
action=0
# transaction_id = random.randrange(1,65535)
transaction_id = 12345
print(transaction_id)
# 12345

packet=struct.pack(">QLL",connection_id,action,transaction_id)
print(repr(packet))
# "\x00\x00\x04\x17'\x10\x19\x80\x00\x00\x00\x00\x00\x0009"

clisocket.sendto(packet, ("tracker.istole.it", 80))
res = clisocket.recv(16)
action,transaction_id,connection_id=struct.unpack(">LLQ",res)
print(action)
# 0
print(transaction_id)
# 12345
print(connection_id)
# 2540598739861590271

关于php - 在 python 中使用 struct 模块在 pack() 中选择格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758448/

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