在將C/C++ 程序移植到PHP 的過程中,經常會遇到數據格式轉換的問題。尤其是處理十六進製字符串轉換為整數的場景,C/C++ 中習慣使用strtol來實現這一目的,而在PHP 中則推薦使用hexdec函數來達到類似效果。
本文將介紹這兩者的差異、使用方式,並通過一個例子演示如何將strtol替換為hexdec 。
在C/C++ 中, strtol是一個強大的字符串轉整數函數。它的原型如下:
long int strtol(const char *nptr, char **endptr, int base);
nptr :指向要轉換的字符串。
endptr :指向字符串中停止轉換的部分(可以為NULL)。
base :轉換所使用的進制(通常是10 或16)。
例如:
char *hex = "0x1A3F";
long result = strtol(hex, NULL, 16);
// result = 6719
PHP 提供了內建函數hexdec ,用於將十六進製字符串轉換為十進制整數。其語法非常簡單:
int hexdec(string $hex_string);
使用示例:
$hex = "1A3F";
$result = hexdec($hex);
// $result = 6719
注意,這裡$hex不應包含0x前綴,否則hexdec可能無法正確解析。
當你將C/C++ 中的strtol替換為PHP 中的hexdec時,需要注意以下幾點:
去掉前綴:PHP 的hexdec不接受0x或0X前綴,必須去除。
輸入驗證:C 中strtol可以識別字符串中的錯誤部分,而hexdec沒有類似的參數返回停止轉換位置,需手動驗證字符串合法性。
大小寫兼容:PHP 的hexdec自動支持大小寫字母A–F,無需轉換。
以下是一個簡單示例,演示如何將一個包含十六進製表示的URL 參數轉換為整數:
<?php
// 假設 URL 為 https://gitbox.net/convert.php?hex=1A3F
$hex = $_GET['hex'] ?? '';
if (preg_match('/^[0-9a-fA-F]+$/', $hex)) {
$decimal = hexdec($hex);
echo "十六進位 {$hex} 对应的十进制值為 {$decimal}";
} else {
echo "无效的十六進位输入。";
}
?>
這個示例中我們首先通過正則表達式確保輸入是合法的十六進制數,然後安全地調用hexdec 。與C/C++ 中使用strtol(hex, NULL, 16)的思路一致,但更加簡潔。
儘管PHP 中沒有像strtol那樣靈活的多參數函數, hexdec在大多數遷移場景中已經足夠使用。只要注意輸入格式和前綴處理, hexdec能夠很好地承擔strtol在C/C++ 中的角色,完成十六進製到十進制的安全轉換。對於需要更複雜處理的場景,結合正則驗證或手動處理字符串也是完全可行的策略。