Php 如何添加十六进制字符串并对其执行NOT操作?
我有一个由十六进制字符组成的长字符串:Php 如何添加十六进制字符串并对其执行NOT操作?,php,hex,Php,Hex,我有一个由十六进制字符组成的长字符串: $hex = '004d41494e0000000048001B030C1A050EEFF500'. 'F5FB0000400804FBF101F1F201F2F301F3FA00FA' . '48454c4c4fFA00FAFB0008400804FBF101F1F201F2F30' . '2F3574f524c44EF'; 从这个字符串中,我必须通过将这个字符串中的字节相加来计算“验证”。然后对其执行NOT操
$hex = '004d41494e0000000048001B030C1A050EEFF500'.
'F5FB0000400804FBF101F1F201F2F301F3FA00FA' .
'48454c4c4fFA00FAFB0008400804FBF101F1F201F2F30' .
'2F3574f524c44EF';
从这个字符串中,我必须通过将这个字符串中的字节相加来计算“验证”。然后对其执行NOT操作
在文档中(这是一个用于控制串行设备的字符串),验证应该是1C5B
,而在非之后应该是E3A4
因为我已经完全疯了,所以我不知道如何解决这个“问题”。我找到了执行NOT操作的方法。但是如何用十六进制数对数据进行汇总,最后得到1C5B
..
<?php
$hex = '004d41494e0000000048001B030C1A050EEFF500'.
'F5FB0000400804FBF101F1F201F2F301F3FA00FA' .
'48454c4c4fFA00FAFB0008400804FBF101F1F201F2F30' .
'2F3574f524c44EF';
$n = strlen($hex);
$sum = 0;
for ($i = 0; $i < $n; $i+= 2)
{
//fetch 2 chars from string
$byte = $hex[$i].$hex[$i + 1];
$byte = intval($byte, 16);
$sum += $byte;
}
//0x1C5B;
print sprintf('0x%4X', $sum)."\n";
$sum = ~$sum;
//To avoid the problem: prints FFFFE3A4, and not E3A4
$sum = $sum & 0xFFFF;
//E3A4
print sprintf('0x%4X', $sum)."\n";
编辑
说明:
假设输入字符串的字符数为偶数,我们可以从第一个字节开始,使用两个十六进制字符(表示一个字节)。这就是我所做的。然后我们循环这两个字符的子字符串,并将它们解析为数字,然后将其添加到主和中。在那之后,剩下的唯一一件事就是用十六进制数表示这个和,使用
参考资料来源:
你能解释一下吗?我喜欢这个解决方案的清洁度。
$hex_array = str_split($hex, 2);
foreach ($hex_array as $byte) {
$sum += hexdec($byte);
}
echo "Sum: ", $sum, "\n";
echo dechex($sum);