Python转PHP字节字符串转换遇阻,求修正代码获一致结果2734
问题:Python转PHP时字节处理导致校验和结果不一致
尝试将以下Python代码转换为PHP时,处理字节数据出现问题:PHP代码运行结果为2047,而Python代码的结果是2734,需要修正PHP代码以得到一致结果。
Python 代码
indexes = [8, 13, 23, 13, 37, 23, 31, 11, 8, 37, 23, 27, 12, 9, 21, 20, 6, 8, 12, 16, 12, 17, 35, 37, 35, 28, 13, 35, 9, 31, 2, 25] sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90' sha_1_b = sha_1_sign.encode("ascii") checksum = sum([sha_1_b[number] for number in indexes]) print(checksum) # 结果:2734
原PHP代码(结果不符)
$indexes = [8, 13, 23, 13, 37, 23, 31, 11, 8, 37, 23, 27, 12, 9, 21, 20, 6, 8, 12, 16, 12, 17, 35, 37, 35, 28, 13, 35, 9, 31, 2, 25]; $sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90'; $sha_1_b = hex2bin($sha_1_sign); $checksum = 0; foreach ($indexes as $number) { if (isset($sha_1_b[$number])) { $checksum += ord($sha_1_b[$number]); } } echo $checksum; # 结果:2047
错误原因
Python中sha_1_sign.encode("ascii")的作用是将字符串每个字符转换为对应的ASCII字节值(例如字符'c'的ASCII码是99,'f'是102);而PHP里的hex2bin($sha_1_sign)是把十六进制字符串解码为二进制数据(例如把'cf'解码为单个字节0xCF,对应十进制207),两者逻辑完全不同,这就是结果差异的核心原因。
修正后的PHP代码
$indexes = [8, 13, 23, 13, 37, 23, 31, 11, 8, 37, 23, 27, 12, 9, 21, 20, 6, 8, 12, 16, 12, 17, 35, 37, 35, 28, 13, 35, 9, 31, 2, 25]; $sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90'; $checksum = 0; foreach ($indexes as $number) { // 直接按索引访问原字符串的单个字符 if (isset($sha_1_sign[$number])) { $checksum += ord($sha_1_sign[$number]); } } echo $checksum; // 结果:2734
说明
修正后的代码直接使用原字符串$sha_1_sign,通过下标访问对应位置的字符,用ord()获取其ASCII值并累加,和Python的逻辑完全一致,因此能得到相同的2734结果。
内容的提问来源于stack exchange,提问作者Mihai Galan
相关产品推荐
相关产品推荐

