Objective c 理解十六进制逻辑

Objective c 理解十六进制逻辑,objective-c,hex,Objective C,Hex,发现下面的十六进制代码逻辑很难理解。请任何人解释一下开关状态下的“和”符号,以及如何计算先前的标记大小 - (void)parse:(NSInputStream*)inputStream { NSInteger MASK = 0x1f; NSInteger Type1 = 8; NSInteger Type2 = 9; NSInteger Type3 = 18; uint8_t header[11]; long len = [inputStream read:

发现下面的十六进制代码逻辑很难理解。请任何人解释一下开关状态下的“和”符号,以及如何计算先前的标记大小

- (void)parse:(NSInputStream*)inputStream {

  NSInteger MASK = 0x1f;
  NSInteger Type1 = 8;
  NSInteger Type2 = 9;
  NSInteger Type3 = 18;

    uint8_t header[11];
    long len = [inputStream read:header maxLength:11];

    //How does it work?
    switch (header[0] & MASK) {
        case  Type1:
            self.type = Type_1;
            break;
        case Type2:
            self.type = Type_2;
            break;
    }

    self.dataSize = ((header[1] & 0x000000FF) << 16) | ((header[2] & 0x000000FF) << 8) | (header[3] & 0x000000FF);

        // read previous tag size
    uint8_t tagSize[4];
    [inputStream read:tagSize maxLength:4];
    int previousTagSize = ((tagSize[0] & 0x000000FF) << 24) |
                          ((tagSize[1] & 0x000000FF) << 16) |
                          ((tagSize[2] & 0x000000FF) << 8) |
                          (tagSize[3] & 0x000000FF);

    if (previousTagSize != 11 + self.dataSize) {
        NSLog(@"Invalid .");
    }
}
-(void)parse:(NSInputStream*)inputStream{
NSInteger MASK=0x1f;
NSInteger类型1=8;
NSInteger类型2=9;
NSInteger类型3=18;
uint8_t头[11];
long len=[inputStream read:header maxLength:11];
//它是如何工作的?
开关(标头[0]&掩码){
案例类型1:
self.type=type_1;
打破
案例类型2:
self.type=type_2;
打破
}
self.dataSize=((头[1]&0x000000FF)
发现下面的十六进制代码逻辑很难理解。

“逻辑”不是十六进制,它是整数和位逻辑的组合

“十六进制”只是在Objective-C程序文本中表示整数值的一种方式。编译后的Objective-C所执行的计算机将以有序位序列的形式执行,而不管程序文本中整数的文本表示形式如何

例如,
104
(十进制)、
0x68
(十六进制)和
0150
(八进制)如果存储在一个字节中,则都使用相同的有序位序列
01101000
。计算机还将UTF-8字符“h”视为相同的有序位序列

(注意:我在这个答案中使用字节或8位来保存键入的大量零,64位机器上的
NSInteger
是64位,但对于这里示例中使用的值,这些位中的前56位都是零。)

位是否被视为整数、浮点数、字符等取决于上下文,而这正是整数和位逻辑的所在

有人能解释一下处于开关状态的安培数吗

Objective-C中的
&
运算符是按位的,即两个操作数中的有序位序列使用逻辑(也称为布尔)和函数成对组合(
0和0=0
0和1=0
1和0=0
1和1=1
)。代码片段:

header[0] & MASK
正在使用
&
执行屏蔽操作-如果查看and函数,如果一个操作数是
1
,则结果是另一个操作数,如果是
0
,则结果是
0
,因此and可用于“屏蔽”序列的一部分

例如考虑<代码>标题[0 ]

持有上面104的表示,8位表示为
01101000
掩码的表示为
0x1F
,值为
0x1F
,8位表示为
0001111
。使用按位组合这两种表示,并给出序列
00001000
,其中前3个零是re由于第二个操作数(“掩码”)中的零,并且5位序列
01000
与第一个操作数的最后五位相同,因为第二个操作数都是1

在该位之后,如果结果位序列被解释为整数,则值为
8
,正好与程序中的
Type1
值相同

因此,
开关的作用是根据
头[0]
的最后5位的整数解释进行选择。例如,当多个数据值被打包到更大的存储单元中时,就会出现这种类型的代码–在这种情况下,64位中有5位(64位计算机上
NSInteger
的存储大小)

以及如何计算先前的标记大小。


同样,这只是按位操作,运算符
|
是按位的,或者运算符
到底是什么部分?
&
?注释,可用于打印所需的所有中间值,例如
头[1]
,然后
0x000000FF
,然后
(头[1]&0x000000FF)
,然后
(header[1]&0x000000FF)@Larme你说的“十六进制是8位”。不,十六进制是一个数字的基数16表示。位数与此无关。
int previousTagSize = ((tagSize[0] & 0x000000FF) << 24) |
                      ((tagSize[1] & 0x000000FF) << 16) |
                      ((tagSize[2] & 0x000000FF) << 8) |
                      (tagSize[3] & 0x000000FF);