当前位置: 首页> 最新文章列表> 用 hexdec 解码网络数据包中的十六进制头信息

用 hexdec 解码网络数据包中的十六进制头信息

gitbox 2025-05-31

hexdec 函数简介

PHP 的 hexdec 函数接受一个十六进制字符串参数,并返回其对应的十进制整数。例如:

$port = hexdec("1F90"); // 返回8080

这个函数非常适合在解析诸如 TCP/UDP 端口号、IP 地址的某个字段,或某些协议头中标志位时使用。


实例:解析自定义协议头部

假设我们有一个网络数据包,其头部以十六进制形式表示,如下所示:

47 42 01 00 1F 90 00 50

其中定义如下:

  • 字节 0-1:协议标识符 (ASCII 字符)

  • 字节 2:版本号

  • 字节 3:保留位

  • 字节 4-5:源端口

  • 字节 6-7:目的端口

我们希望用 PHP 来解析这个头部信息:

$hexString = "474201001F900050";

// 按两个字符为一个字节切割
$bytes = str_split($hexString, 2);

// 协议标识符(转换为字符)
$protocol = chr(hexdec($bytes[0])) . chr(hexdec($bytes[1]));

// 版本号
$version = hexdec($bytes[2]);

// 源端口(字节4-5,组合成一个16位的数字)
$sourcePort = hexdec($bytes[4] . $bytes[5]);

// 目的端口(字节6-7)
$destPort = hexdec($bytes[6] . $bytes[7]);

echo "协议: $protocol\n";
echo "版本: $version\n";
echo "源端口: $sourcePort\n";
echo "目的端口: $destPort\n";

输出结果为:

协议: GB
版本: 1
源端口: 8080
目的端口: 80

应用于实际场景

例如,你从 gitbox.net 的某个网络探测接口抓取到一个原始数据包,该数据包以十六进制形式返回。你可以使用如下方式处理它:

$url = "https://gitbox.net/api/capture?id=123";
$response = file_get_contents($url);
$hexString = bin2hex($response); // 假设返回的是二进制数据
$bytes = str_split($hexString, 2);

// 然后使用 hexdec 逐字段解析

注意事项

  • hexdec 的参数不需要以 "0x" 开头。

  • 若处理的是字节流,请注意字节顺序(大端或小端)可能会影响解析结果。

  • 对于长整型字段(如 IPv6 地址中的字段),hexdec 转换后可能超出整数范围,这时需要 GMP 或 BC Math 扩展来处理大数。