3.Byte 转 NSData 以及NSData转Byte

3.Byte 转 NSData 以及NSData转Byte_第1张图片
你若不努力,这世界怎能如你所愿.gif

如题,这方面的使用不是太多,如果你从事的工作需要与硬件之间进行通信,比如 智能家居, 蓝牙通信。 此时你或许需要进行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);
3.Byte 转 NSData 以及NSData转Byte_第2张图片
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]; // 只返回数组中的最后的一个元素
}
3.Byte 转 NSData 以及NSData转Byte_第3张图片
2.Data转Byte.png

3. 根据bit 的高低位判断状态

硬件会返我一个 字节的数据, 当然是NSData的。
需要根据前三个bit的状态判断成功或失败。 搞硬件的就喜欢这么搞。苦了哥哥了。
最开始是这样想的:NSData-->16进制字符串--> 二进制字符串---> 在将字符串转为数字, 好像只能对数字进行&(按位与) |(按位或) ^(按位异或) ........运算。 搞这么复杂,还是搞不出来。
其实简单点(ˇˍˇ) (ˇˍˇ) 想: 不就是做个 & 运算吗?
把NSData转为Byte 不就结了。

3.Byte 转 NSData 以及NSData转Byte_第4张图片
需求是这样的.png

就是一个字节的事。

  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;

就这么多了。

你可能感兴趣的:(3.Byte 转 NSData 以及NSData转Byte)