如何在PHP中实现类似Python libnum库s2n函数的字节转整数功能
PHP实现Python libnum库s2n函数的方案
核心逻辑说明
libnum的s2n函数本质是将输入字符串按大端字节序拼接所有字节转换为十进制整数,等价于把整个字符串的二进制内容直接作为无符号大整数读取。
你原有代码仅生成了带\x前缀的十六进制表示字符串,没有完成数值累加逻辑,可参考以下修改方案:
普通短字符串实现(PHP int范围内)
function s2n(string $inputStr): int { $result = 0; $strLength = strlen($inputStr); for ($i = 0; $i < $strLength; $i++) { // 每次左移8位等价于乘以256,再或上当前字节的ASCII值完成累加 $result = ($result << 8) | ord($inputStr[$i]); } return $result; } // 测试验证 echo s2n("Text"); // 输出:1415936116,与Python s2n输出一致 echo PHP_EOL; echo s2n("\x31\x34\x31\x35\x39\x33\x36\x31\x31\x36"); // 输出:1415936116,与Python s2n输出一致
长字符串任意精度实现(依赖BC Math扩展)
如果处理的字符串过长,超出PHP原生int的取值范围(64位系统最大为9223372036854775807),可使用BC Math扩展实现任意精度运算:
function s2n_big(string $inputStr): string { $result = '0'; $strLength = strlen($inputStr); for ($i = 0; $i < $strLength; $i++) { $result = bcadd(bcmul($result, '256'), (string)ord($inputStr[$i])); } return $result; }
内容的提问来源于stack exchange,提问作者Mahdi Khezrabadi
相关产品推荐
相关产品推荐

