
在 PHP 中,字符串与多进制之间的转换是一个常见的需求,尤其是在处理短链接、ID 编码、数据压缩等场景时。以下是一个完整的实例代码,展示了如何实现字符串与多进制(如 base-36、base-62 等)之间的转换。
1. 实现功能
将字符串转换为多进制表示。
将多进制表示转换回原始字符串。
2. 代码实现
定义字符集
首先,定义一个字符集,用于表示目标进制的所有符号。
$charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
字符串转多进制
将字符串转换为多进制表示。
function stringToCustomBase($string, $base, $charset) {
$number = 0;
$length = strlen($string);
// 将字符串转换为十进制数
for ($i = 0; $i < $length; $i++) {
$char = $string[$i];
$value = ord($char); // 获取字符的 ASCII 值
$number = $number * 256 + $value; // 假设每个字符占 8 位(1 字节)
}
// 将十进制数转换为目标进制
return decimalToCustomBase($number, $base, $charset);}function decimalToCustomBase($number, $base, $charset) {
if ($number == 0) {
return $charset[0];
}
$result = '';
while ($number > 0) {
$remainder = $number % $base;
$result = $charset[$remainder] . $result;
$number = (int)($number / $base);
}
return $result;}多进制转字符串
将多进制表示转换回原始字符串。
function customBaseToString($customBaseNumber, $base, $charset) {
// 将目标进制数转换为十进制数
$decimalNumber = customBaseToDecimal($customBaseNumber, $base, $charset);
// 将十进制数转换为字符串
$result = '';
while ($decimalNumber > 0) {
$remainder = $decimalNumber % 256;
$result = chr($remainder) . $result;
$decimalNumber = (int)($decimalNumber / 256);
}
return $result;}function customBaseToDecimal($number, $base, $charset) {
$result = 0;
$length = strlen($number);
for ($i = 0; $i < $length; $i++) {
$char = $number[$i];
$value = strpos($charset, $char);
$result = $result * $base + $value;
}
return $result;}3. 完整示例
以下是一个完整的示例,展示了如何将字符串转换为 base-62 进制,并转换回原始字符串。
<?php// 定义字符集$charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';// 字符串转多进制function stringToCustomBase($string, $base, $charset) {
$number = 0;
$length = strlen($string);
for ($i = 0; $i < $length; $i++) {
$char = $string[$i];
$value = ord($char);
$number = $number * 256 + $value;
}
return decimalToCustomBase($number, $base, $charset);}function decimalToCustomBase($number, $base, $charset) {
if ($number == 0) {
return $charset[0];
}
$result = '';
while ($number > 0) {
$remainder = $number % $base;
$result = $charset[$remainder] . $result;
$number = (int)($number / $base);
}
return $result;}// 多进制转字符串function customBaseToString($customBaseNumber, $base, $charset) {
$decimalNumber = customBaseToDecimal($customBaseNumber, $base, $charset);
$result = '';
while ($decimalNumber > 0) {
$remainder = $decimalNumber % 256;
$result = chr($remainder) . $result;
$decimalNumber = (int)($decimalNumber / 256);
}
return $result;}function customBaseToDecimal($number, $base, $charset) {
$result = 0;
$length = strlen($number);
for ($i = 0; $i < $length; $i++) {
$char = $number[$i];
$value = strpos($charset, $char);
$result = $result * $base + $value;
}
return $result;}// 示例$string = "Hello, World!";$base = 62;// 转换为 base-62$customBaseNumber = stringToCustomBase($string, $base, $charset);echo "String: $string -> Base-$base: $customBaseNumber\n"; // 输出:String: Hello, World! -> Base-62: 1wJfrzvdbuF// 转换回字符串$convertedBack = customBaseToString($customBaseNumber, $base, $charset);echo "Base-$base: $customBaseNumber -> String: $convertedBack\n"; // 输出:Base-62: 1wJfrzvdbuF -> String: Hello, World!?>4. 代码说明
字符集:
$charset定义了目标进制的所有符号。字符串转多进制:
将字符串的每个字符转换为 ASCII 值。
将所有 ASCII 值组合成一个十进制数。
将十进制数转换为目标进制。
多进制转字符串:
将目标进制数转换为十进制数。
将十进制数拆分为 ASCII 值。
将 ASCII 值转换为字符。
5. 应用场景
短链接生成:将长 URL 转换为短字符串。
ID 编码:将数据库中的数字 ID 转换为更短的字符串。
数据压缩:将大字符串转换为更短的表示形式。
6. 总结
通过自定义字符集和进制转换算法,可以实现字符串与多进制之间的灵活转换。这种方法适用于多种场景,并且可以根据需求扩展字符集和进制范围。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


