Javascript 如何在PHP中翻转字节数组
我试图为下面的js函数找到一个php等价物: 原始JS函数: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
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);
}