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