如题,这方面的使用不是太多,如果你从事的工作需要与硬件之间进行通信,比如 智能家居, 蓝牙通信。 此时你或许需要进行NSData 和Byte 的相互转换。
参考了网上的相关资料,总算是把功能实现了。 下面的方法封装的不好,都是写个固定的长度。 只能是提供一种参考。
1.Byte 转NSData
//0xFFAA0000
// 注:两个16进制数是一个字节
Byte cmdByte[4];
cmdByte[0] = 0xFF;
cmdByte[1] = 0xAA;
for (int i = 2 ; i < 4; i++) {
cmdByte[i] = 0x00;
}
// Byte 转NSData
NSData *cmdData1 = [NSData dataWithBytes:cmdByte length:4];
NSLog(@"方式一:%@ 长度:%ld",cmdData1,cmdData1.length);
NSData *cmdData2 = [NSData dataWithBytes:&cmdByte length:4]; //两种方式都一样
NSLog(@"方式二:%@ 长度:%ld",cmdData2,cmdData2.length);
1.Byte转Data.png
2.NSData 转 Byte
1.data(16 进制)转为Byte 结果以10进制结果显示
2.数组作为函数返回值不太会, 只返回数组最后一个元素
/**缺点 只返回最后一个字节*/
- (Byte)byteFromData:(NSData *)originData {
if (originData.length==0) {
NSLog(@"数据长度为0,无法解析");
return 0;
}
NSUInteger len = [originData length];
// 定义byte数组
Byte byteArr[len];
for (int i = 0; i < len; i++) {
NSData *subData = [originData subdataWithRange:NSMakeRange(i, 1)]; // 按字节切割
byteArr[i] = ((Byte *)[subData bytes])[0]; // ?不太理解
}
for (int i = 0; i < len; i++) {
NSLog(@":%d",byteArr[i]); // 打印byte
}
return byteArr[len-1]; // 只返回数组中的最后的一个元素
}
2.Data转Byte.png
3. 根据bit 的高低位判断状态
硬件会返我一个 字节的数据, 当然是NSData的。
需要根据前三个bit的状态判断成功或失败。 搞硬件的就喜欢这么搞。苦了哥哥了。
最开始是这样想的:NSData-->16进制字符串--> 二进制字符串---> 在将字符串转为数字, 好像只能对数字进行&(按位与) |(按位或) ^(按位异或) ........运算。 搞这么复杂,还是搞不出来。
其实简单点(ˇˍˇ) (ˇˍˇ) 想: 不就是做个 & 运算吗?
把NSData转为Byte 不就结了。
就是一个字节的事。
Byte msgByte[1];
msgByte[0] = [troubleData byteFromData:troubleData];
NSLog(@"转换后的byte:%hhu",msgByte[0]);
// 1 失败, 0 成功
// xxxx xxxx
// 1000 0000 0x80
// x000 0000 只需要判断bit7 的值就可以了
BOOL isUnlock = (msgByte[0] & 0x80) ? YES : NO;
BOOL isTimingSuccess = (msgByte[0] & 0x40) ? YES : NO;
BOOL ispwdSuccess = (msgByte[0] & 0x20) ? YES :NO;
就这么多了。
网友评论