Javascript 如何在PHP中翻转字节数组

Javascript 如何在PHP中翻转字节数组,javascript,php,byte,Javascript,Php,Byte,我试图为下面的js函数找到一个php等价物: 原始JS函数: function getAddrCheckSum(addr: Buffer, isContract? : boolean): Hex { const addrPre20 = addr.slice(0, 20); const _checkSum = blake2b(addrPre20, null, ADDR_CHECK_SUM_SIZE); const checkSum = Buffer.from(_checkS

我试图为下面的js函数找到一个php等价物:

原始JS函数:

function getAddrCheckSum(addr: Buffer, isContract? : boolean): Hex {
    const addrPre20 = addr.slice(0, 20);
    const _checkSum = blake2b(addrPre20, null, ADDR_CHECK_SUM_SIZE);
    const checkSum = Buffer.from(_checkSum);

    if (!isContract) {
        return checkSum.toString('hex');
    }

    const newCheckSum = [];
    checkSum.forEach(function (byte) {
        newCheckSum.push(byte ^ 0xFF);
    });

    return Buffer.from(newCheckSum).toString('hex');
}
PHP实现:

include_once('./lib/Blake2b.php');

function getAddrCheckSum($address, $isContract) {
    $ADDR_CHECK_SUM_SIZE = 5;

    $addrPre20 = substr($address, 0, 20);
    $blake2b = new Blake2b($ADDR_CHECK_SUM_SIZE); #<- blake object initialized with size=5
    $checkSum = $blake2b->hash($addrPre20);

    return $checkSum;
    if (!isContract) {
        return strval($checkSum);
    }
另外,用php strval替换js toString是否正确? 还有,我是否需要为php找到一个与“Buffer.from(…,'hex')等效的名称
您的朋友是bin2hex,而不是将其分配给变量。假设
$checkSum
是二进制形式的散列,并且
$isContract
是布尔值,那么只需使用相应数量的
\xFF
字符进行异或
$checkSum

以下是详细的版本:

if(!$isContract)
{
返回bin2hex($checkSum);
}
其他的
{
$newCheckSum=$checkSum^str_pad(“”,strlen($checkSum),“\xFF”);
返回bin2hex($newCheckSum);
}
还有一个简短的例子:

返回bin2hex
(
!$isContract?$checkSum:$checkSum^str_pad(“,strlen($checkSum),“\xFF”)
);

bin2hex
是你的朋友。假设
$checkSum
是二进制形式的散列,并且
$isContract
是布尔值,那么只需使用相应数量的
\xFF
字符进行异或
$checkSum

以下是详细的版本:

if(!$isContract)
{
返回bin2hex($checkSum);
}
其他的
{
$newCheckSum=$checkSum^str_pad(“”,strlen($checkSum),“\xFF”);
返回bin2hex($newCheckSum);
}
还有一个简短的例子:

返回bin2hex
(
!$isContract?$checkSum:$checkSum^str_pad(“,strlen($checkSum),“\xFF”)
);

请提供输入和预期输出的示例。以下是问题说明:“将文字地址6-45之间的字符作为20字节的地址正文,并进行检查:如果地址正文校验和的十六进制字符串与文字地址中46到55之间的字符相匹配,则将0设置为类型标志,因为地址是用户地址。如果地址体的翻转校验和的十六进制字符串与文字地址的第46到55个字符相同,则将1设置为Type Flag,因为地址是合同地址。校验和是根据地址体采用5字节散列计算的。“示例数据:DBG:Literal地址:vite_24D6313A1EE1BCD8E979565A39C6F4DECC8A1BE01A5DEBEE DBG:Address body:24D6313A1EE1BCD8E979565A39A6F4DECC8A1B DBG:body电流校验和:E01A5DEBEEP请提供输入和预期输出的示例。以下是问题描述:“将文字地址6-45之间的字符作为20字节的地址正文,并进行检查:如果地址正文校验和的十六进制字符串与文字地址中46到55之间的字符相匹配,则将0设置为类型标志,因为地址是用户地址。如果地址体的翻转校验和的十六进制字符串与文字地址的第46到55个字符相同,则将1设置为Type Flag,因为地址是合同地址。校验和是通过在地址体的基础上采用5字节散列来计算的。“示例数据:DBG:Literal addr:vite_24D6313A1EE1BCD8E979565A39AC6F4DECC8A1BE01A5DEBEE DBG:地址体:24D6313A1EE1BCD8E9795A39AC6F4DECC8A1B DBG:体当前校验和:e01a5debee
$newCheckSum = [];
//checkSum.forEach(function (byte) { 
// newCheckSum.push(byte ^ 0xFF);    
//});

return strval($newCheckSum);
}