Python到PHP字节串转换

lsmepo6l  于 2023-06-20  发布在  PHP
关注(0)|答案(1)|浏览(84)

我试图将此Python代码转换为PHP,但我在处理字节数据时卡住了。谁能帮我修改一下这个PHP代码,这样我就可以得到和Python一样的结果,也就是2734
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)
#result 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; 
#result 2047
ctehm74n

ctehm74n1#

Python代码将每个字符视为一个单独的实体,并接受其ASCII值。PHP代码将十六进制字符串转换为它的二进制表示,然后尝试将其作为数组引用。我会先将其拆分为单个字符的数组,然后将每个字符Map到它们的ASCII值。然后使用$indexes中的数字作为要添加的值的索引:

$indexes = [...];
$sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90';
$sha_1_b = array_map(fn($a) => ord($a), str_split($sha_1_sign));
$checksum = 0;
foreach ($indexes as $number) {
    $checksum += $sha_1_b[$number];
}
echo $checksum;

或者你可以将$indexes中的每个值Map到$sha_1_b中的相关索引,然后对得到的Map数组求和:

$indexes = [...];
$sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90';
$sha_1_b = array_map(fn($a) => ord($a), str_split($sha_1_sign));
$checksum = array_sum(array_map(fn($a) => $sha_1_b[$a], $indexes));
echo $checksum;

您还可以使用PHP很少使用的字符串作为数组特性,它允许您通过数组语法引用字符串中的字符。不过我并不喜欢这种表示法,因为其他人看你的代码时可能会感到困惑,他们可能会认为引用是一个数组,而实际上它是一个字符串:

$sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90';
$checksum = 0;
foreach ($indexes as $number) {
    $checksum += ord($sha_1_sign[$number]);
}
echo $checksum;

或者,超级简短的版本:

$indexes = [...];
$sha_1_sign = 'cf493b66e356e588c545df7dda24ed4d404f1c90';
$checksum = array_sum(array_map(fn($a) => ord($sha_1_sign[$a]), $indexes));
echo $checksum;

相关问题