Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何添加十六进制字符串并对其执行NOT操作?_Php_Hex - Fatal编程技术网

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);