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 擴展來處理大數。