首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对php中的nibble/tetrad执行二进制操作?

如何对php中的nibble/tetrad执行二进制操作?
EN

Stack Overflow用户
提问于 2018-07-31 21:03:08
回答 1查看 434关注 0票数 1

所以,我有从0到15的数值,所以我用十六进制代码(0到f)保存了它们。现在,我有了一串数据,其中包含了我的小块的十六进制代码值。

数据如下:

a0fc3d78270db962e4ba525cf3acd

什么是精确的/优雅的/快速的方式执行二进制xor对两个咬咬,什么是最快的方式执行二进制,而不是在咬?

我现在想的是首先将小字节转换成完整的字节:

代码语言:javascript
复制
$nibble = "c";
$numeric = ord($nibble);
$byte = ($numeric<58)?chr($numeric-48):chr($numeric-55);

然后对这些字节执行所需的操作(xor或not),并再次将结果值转换为一个小块。

代码语言:javascript
复制
$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,而不是在咬咬和将结果值作为一个十六进制代码(字符串)?

示例:

代码语言:javascript
复制
'3' xnor 'a' = '6'  
'c' xnor '5' = '6'  
'b' xnor '8' = 'c'
EN

回答 1

Stack Overflow用户

发布于 2018-08-01 19:03:53

使用二进制和操作仅选择相关位:

代码语言:javascript
复制
$nibble1 = hexdec('3');
$nibble2 = hexdec('a');

// nibble1 xnor nibble2
$r = ~($nibble1 ^ $nibble2) & 0x0F;

echo dechex($r); // '6'

这被称为“掩蔽”位,其中0x0F被称为“掩码”。

如果没有掩蔽,~(0x0b ^ 0x08)操作的结果将是ffffffffffffffffc,因为PHP将整数表示为64位长。

现在,当我们应用掩码时,会发生以下情况(为了便于可视化,我省略了4个上字节):

代码语言:javascript
复制
11111111 11111111 11111111 11111100 (ffffffffc)
00000000 00000000 00000000 00001111 (00000000f)
----------------------------------- & (binary AND)
00000000 00000000 00000000 00001100 (00000000c)

我们只“选择”下最后一口。

要遮住上面的咬口,请使用0xF0并(可选)右移4。

代码语言:javascript
复制
$byte1 = hexdec('3f');
$byte2 = hexdec('a5');

$r = (~($byte1 ^ $byte2) & 0xF0) >> 4;

echo dechex($r); // Also '6'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51622020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档