如何使用 php 解码十六进制位掩码


How to decode hexadecimal bitmask with php?

我有一个数据库,其中包含一个包含位掩码的字段,我有一个十六进制位掩码列表,如下所示:

2^8 256 = Type 1
2^9 512 = Type 2
2^0 001 = Type 3
2^4 016 = Type 4
2^1 002 = Type 5
2^5 032 = Type 6

我正在尝试"解码"(不确定正确的术语)
对于PHP来说,位掩码是什么,例如:003

我怎么知道003002 & 001的组合?

拜托,我对此一无所知,帮忙澄清一下。
我需要能够用 php 做到这一点。

首先,您应该为值定义常量:

const TYPE1 = 0b01000000;
const TYPE2 = 0b10000000;
const TYPE3 = 0b00000001;
const TYPE4 = 0b00010000;
const TYPE5 = 0b00000010;
const TYPE6 = 0b00100000;

这会让你保持理智。我使用二进制(0b表示法),但您可以同样轻松地使用十六进制(0x)或十进制;我认为二进制可以最容易地看到哪个位代表哪个常量,当你定义新常量时,你可以很容易地看到哪些位已经被使用。请记住,常量的名称区分大小写...但只要坚持ALL_CAPS常量,你就会省去很多麻烦。

然后,您可以使用逻辑运算符&来测试每个运算符,如@MarkBaker的注释:

if ($mask & TYPE1) echo "Type 1 is set'n";
if ($mask & TYPE2) echo "Type 2 is set'n";
if ($mask & TYPE3) echo "Type 3 is set'n";
if ($mask & TYPE4) echo "Type 4 is set'n";
if ($mask & TYPE5) echo "Type 5 is set'n";
if ($mask & TYPE6) echo "Type 6 is set'n";

对于值 3 的示例,你将得到以下输出:

Type 3 is set
Type 5 is set

另外,在使用PHP(和许多其他语言)工作时需要注意的是 - 用前导零写的数字,例如您的问题中的032,被解释为八进制!因此032实际上不是32,而是26