使用 PHP 将大端 IP 地址转换为 4 字节二进制


big-endian ip address into 4 byte binary with php

我想创建一个私人洪流跟踪器,但我遇到了一个问题。我在协议规范中发现,大多数客户端现在使用的紧凑响应显示为二进制 4 字节 represendint,大端 IP 地址和 2 表示端口。我尝试这样做,但不确定我应该输入 IP 的格式

我尝试了以下方法

$IP = "12.34.56.78";
$port = "12345";
$binary = pack("Nn", $IP, $port);

但是当我尝试使用 unpack("Nn" $binary) 将其转换回来时,我只是返回了 IP 地址的第一部分,在这个例子中,它将是"12"我尝试使用种子客户端尝试这样做,我得到"内部服务器错误"

我也尝试过 ip2long,当我反转时,我得到了长 ip,但是当我不确定这是正确的格式还是什么时,我所知道的只是在 6 次咬中寻找 ip 和端口。

任何关于我出错的地方的建议将不胜感激

贵宾32

试试这个:

包装:

$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

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

<?php
  $IP = "12.34.56.78";
  $port = "12345";
  $octets = explode('.', $IP);
  $binary = pack('ccccn', $octets[0], $octets[1], $octets[2], $octets[3], $port);

要转换回来,它会稍微复杂一些。调用unpack()时,您需要使用中继器并命名组件:

<?php
  $unpacked = unpack('c4octet/nport', $binary);
  $IP = $unpacked['octet1'].".".$unpacked['octet2'].".".$unpacked['octet3'].".".$unpacked['octet4'];
  $port = $unpacked['port'];