用php将大端ip地址转换成4字节二进制

用php将大端ip地址转换成4字节二进制,php,bittorrent,endianness,tracker,Php,Bittorrent,Endianness,Tracker,我正在寻找创建一个私人洪流跟踪,但我遇到了一个问题。我在协议规范中发现,大多数客户机现在使用的紧凑响应是以二进制4字节表示的,以big-endian表示IP地址,2表示端口。我尝试过这样做,但不确定输入IP的格式 我尝试了以下几点 $IP = "12.34.56.78"; $port = "12345"; $binary = pack("Nn", $IP, $port); 但是,当我尝试使用unpack(“Nn”$binary)将其转换回时,我只得到了IP addrss的第一部分的返回,在这

我正在寻找创建一个私人洪流跟踪,但我遇到了一个问题。我在协议规范中发现,大多数客户机现在使用的紧凑响应是以二进制4字节表示的,以big-endian表示IP地址,2表示端口。我尝试过这样做,但不确定输入IP的格式

我尝试了以下几点

$IP = "12.34.56.78";
$port = "12345";

$binary = pack("Nn", $IP, $port);
但是,当我尝试使用unpack(“Nn”$binary)将其转换回时,我只得到了IP addrss的第一部分的返回,在这个示例中,它将是“12”,我尝试使用torrent客户端进行此转换,我得到了“internal server error”

我也尝试过ip2long,当我反向时,我得到了长ip,但当我不确定这是否是正确的格式或什么,我所知道的是寻找ip和端口在6位

如果您对我的错误有任何建议,我们将不胜感激


Vip32要转换为二进制,首先需要将其从人类可读的点十进制符号转换为计算机可读的符号-
pack()
无法理解字符串中的点
。您可以将地址拆分为其组成部分,并将其视为无符号字符(
c
):

试试这个:

包装:

$ip = "12.34.56.78";
$port = 12345;

$packed = pack("Nn", ip2long($ip), $port);
拆包:

$unpacked = unpack("Nip/nport", $packed);

echo "IP was ".long2ip($unpacked["ip"])."\n";
echo "Port was ".$unpacked["port"]."\n";
输出:

IP was 12.34.56.78
Port was 12345

“咬”可能是指字节。这可能会让人困惑:)(位->咬!=byte)
$unpacked = unpack("Nip/nport", $packed);

echo "IP was ".long2ip($unpacked["ip"])."\n";
echo "Port was ".$unpacked["port"]."\n";
IP was 12.34.56.78
Port was 12345