从可视化数据中得到真实数据,并且得到的可视化数据是小端显示的,2字节组合逆序。
例如:
接收到的小端数据信息: 1A2B 数据形式是:0x31413242. //总共4Bytes,31表示1,41表示A
需要求得的数据是:0x2B1A //总共2Bytes
测试:
UInt32 a = 0x31413242;
NSData *data = [NSData dataWithBytes:&a length:sizeof(a)];
NSLog(@"%@",data);
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//打印结果:
//2018-05-23 11:23:20.205453+0800 TestOC[3593:349610] <42324131>
//2018-05-23 11:23:20.205708+0800 TestOC[3593:349610] B2A1
因为本机是小端显示,得到打印的B2A1是按字节逆序的结果
求解的过程:
注:接收的4bytes小端数据:0x31413242. 显示结果是:1A2B. 求2bytes结果0x2B1A
UInt32 a = 0x31413242;
NSData *receiveData = [NSData dataWithBytes:&a length:sizeof(a)];
NSLog(@"原始数据(小端打印):%@",receiveData);
NSMutableData *resultData = [[NSMutableData alloc] initWithCapacity:2];
for (NSInteger i = receiveData.length * 0.5 - 1; i >= 0 ; i--) {
NSData *subData = [receiveData subdataWithRange:NSMakeRange(i * 2, 2)];
UInt8 b = 0;
UInt8 resultB = 0; //将两个字节转化为1个字节
for (NSInteger j = 0; j < 2; j++) {
[subData getBytes:&b range:NSMakeRange(j, 1)];
if (b >= '0' && b <= '9') {
b = b - '0';
}
else if (b >= 'a' && b <= 'f') {
b = b - 'a' + 10;
}
else if (b >= 'A' && b <= 'F') {
b = b - 'A' + 10;
}
else {
continue;
}
resultB |= b << (1 -j) * 4 ; //第一个字节需要移动,第二个不需要移动
}
NSData *resultSubData = [NSData dataWithBytes:&resultB length:1];
[resultData appendData:resultSubData];
}
NSLog(@"得到结果(小端打印)%@",resultData);
//2018-05-23 13:32:49.018896+0800 TestOC[3842:465923] 原始数据(小端打印):<42324131>
//2018-05-23 13:32:49.133772+0800 TestOC[3842:465923] 得到结果(小端打印)<a1b2>
因为resultData是小端数据形式,实际得到的是0x2b1a