所以,我有从0到15的数值,所以我用十六进制代码(0到f)保存了它们。现在,我有了一串数据,其中包含了我的小块的十六进制代码值。
数据如下:
a0fc3d78270db962e4ba525cf3acd
什么是精确的/优雅的/快速的方式执行二进制xor对两个咬咬,什么是最快的方式执行二进制,而不是在咬?
我现在想的是首先将小字节转换成完整的字节:
$nibble = "c";
$numeric = ord($nibble);
$byte = ($numeric<58)?chr($numeric-48):chr($numeric-55);然后对这些字节执行所需的操作(xor或not),并再次将结果值转换为一个小块。
$byte1 = chr(7); $byte2=chr(12);
$xor_val = $byte1 ^ $byte2;
$numeric = ord($xor_val);
$nibble = ($numeric<58)?chr($numeric+48):chr($numeric+55);这种方法的问题是,如果我在一个字节上应用了not (~)操作,那么它也会反转前4位(从而将1111位添加到该字节的左侧),而且在用上面所示的代码将其重新转换为一个小块之前,我必须从结果的ord()值中减去240。这不仅使将来对代码的升级变得很麻烦,而且使将来更难解释代码的功能。
什么是最佳/准确的方式来执行按位xor,而不是在咬咬和将结果值作为一个十六进制代码(字符串)?
示例:
'3' xnor 'a' = '6'
'c' xnor '5' = '6'
'b' xnor '8' = 'c'发布于 2018-08-01 19:03:53
使用二进制和操作仅选择相关位:
$nibble1 = hexdec('3');
$nibble2 = hexdec('a');
// nibble1 xnor nibble2
$r = ~($nibble1 ^ $nibble2) & 0x0F;
echo dechex($r); // '6'这被称为“掩蔽”位,其中0x0F被称为“掩码”。
如果没有掩蔽,~(0x0b ^ 0x08)操作的结果将是ffffffffffffffffc,因为PHP将整数表示为64位长。
现在,当我们应用掩码时,会发生以下情况(为了便于可视化,我省略了4个上字节):
11111111 11111111 11111111 11111100 (ffffffffc)
00000000 00000000 00000000 00001111 (00000000f)
----------------------------------- & (binary AND)
00000000 00000000 00000000 00001100 (00000000c)我们只“选择”下最后一口。
要遮住上面的咬口,请使用0xF0并(可选)右移4。
$byte1 = hexdec('3f');
$byte2 = hexdec('a5');
$r = (~($byte1 ^ $byte2) & 0xF0) >> 4;
echo dechex($r); // Also '6'https://stackoverflow.com/questions/51622020
复制相似问题