當前位置: 首頁> 最新文章列表> 用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 擴展來處理大數。