iOS 蓝牙 数据进制转换(16转2、10,2转10、16,10转2、16,data转字符串、int)

451 阅读1分钟

前提:
最近开发蓝牙项目,收集的一些 数据进制转换方法。有一些是自己使用过的,没问题,有些并未使用到, 如有错误,敬请原谅!

十六进制转换为二进制

/**
 十六进制转换为二进制
 @param hex 十六进制数
 @return 二进制数
 */
+ (NSString *)getBinaryByHex:(NSString *)hex {
 
    NSMutableDictionary *hexDic = [[NSMutableDictionary alloc] initWithCapacity:16];
    [hexDic setObject:@"0000" forKey:@"0"];
    [hexDic setObject:@"0001" forKey:@"1"];
    [hexDic setObject:@"0010" forKey:@"2"];
    [hexDic setObject:@"0011" forKey:@"3"];
    [hexDic setObject:@"0100" forKey:@"4"];
    [hexDic setObject:@"0101" forKey:@"5"];
    [hexDic setObject:@"0110" forKey:@"6"];
    [hexDic setObject:@"0111" forKey:@"7"];
    [hexDic setObject:@"1000" forKey:@"8"];
    [hexDic setObject:@"1001" forKey:@"9"];
    [hexDic setObject:@"1010" forKey:@"A"];
    [hexDic setObject:@"1011" forKey:@"B"];
    [hexDic setObject:@"1100" forKey:@"C"];
    [hexDic setObject:@"1101" forKey:@"D"];
    [hexDic setObject:@"1110" forKey:@"E"];
    [hexDic setObject:@"1111" forKey:@"F"];
 
    NSString *binary = @"";
    for (int i=0; i<[hex length]; i++) {
 
        NSString *key = [hex substringWithRange:NSMakeRange(i, 1)];
        NSString *value = [hexDic objectForKey:key.uppercaseString];
        if (value) {
 
            binary = [binary stringByAppendingString:value];
        }
    }
    return binary;
}

十六进制转换为十进制

/**
 十六进制转换为十进制
 @param hex 十六进制数
 @return 十进制数
 */
+ (NSString *)decimalStringFromHexString:(NSString *)hex{
    
    NSString * decimalStr = [NSString stringWithFormat:@"%lu",strtoul([hex UTF8String],0,16)];
    return decimalStr;
}

十六进制转换为普通字符串的。

/**
 十六进制转换为普通字符串的。
 @param hexString 十六进制
 @return string
*/
+ (NSString *)stringFromHexString:(NSString *)hexString
{
    if(hexString.length % 2 != 0)
    {
        return nil;
    }
    char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);
    bzero(myBuffer, [hexString length] / 2 + 1);
    for (int i = 0; i < [hexString length] - 1; i += 2)
    {
        unsigned int anInt;
        NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];
        NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];
        [scanner scanHexInt:&anInt];
        myBuffer[i / 2] = (char)anInt;
    }
    NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:NSUTF8StringEncoding];
    return unicodeString;
}

普通字符串转换为十六进制

/**
 普通字符串转换为十六进制
@param string 普通字符串
@return 十六进制字符串
*/
+ (NSString *)hexStringFromString:(NSString *)string {
    NSData *myD = [string dataUsingEncoding:NSUTF8StringEncoding];
    Byte *bytes = (Byte *)[myD bytes];
    //下面是Byte 转换为16进制。
    NSString *hexStr=@"";
    for (int i=0;i<[myD length];i++) {
        NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
        
        if ([newHexStr length]==1) {
           hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
        }
        else{
            hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
        }

    }
    return hexStr;
}

十进制转换为二进制

/**
 十进制转换为二进制
 @param decimal 十进制数
 @return Binary 二进制数
 */
+ (NSString *)getBinaryByDecimal:(NSInteger)decimal {
 
    NSString *binary = @"";
    while (decimal) {
 
        binary = [[NSString stringWithFormat:@"%ld", decimal % 2] stringByAppendingString:binary];
        if (decimal / 2 < 1) {
 
            break;
        }
        decimal = decimal / 2 ;
    }
    if (binary.length % 4 != 0) {
 
        NSMutableString *mStr = [[NSMutableString alloc]init];;
        for (int i = 0; i < 4 - binary.length % 4; i++) {
 
            [mStr appendString:@"0"];
        }
        binary = [mStr stringByAppendingString:binary];
    }
    return binary;
}

十进制转换十六进制

/**
 十进制转换十六进制
 @param decimal 十进制数
 @return 十六进制数
 */
+ (NSString *)getHexByDecimal:(NSInteger)decimal {
 
    NSString *hex =@"";
    NSString *letter;
    NSInteger number;
    for (int i = 0; i<9; i++) {
 
        number = decimal % 16;
        decimal = decimal / 16;
        switch (number) {
 
            case 10:
                letter =@"A"; break;
            case 11:
                letter =@"B"; break;
            case 12:
                letter =@"C"; break;
            case 13:
                letter =@"D"; break;
            case 14:
                letter =@"E"; break;
            case 15:
                letter =@"F"; break;
            default:
                letter = [NSString stringWithFormat:@"%ld", number];
        }
        hex = [letter stringByAppendingString:hex];
        if (decimal == 0) {
 
            break;
        }
    }
    return hex;
}
 

二进制转换成十六进制

/**
 二进制转换成十六进制
 @param binary 二进制数
 @return Hex 十六进制数
 */
+ (NSString *)getHexByBinary:(NSString *)binary {
 
    NSMutableDictionary *binaryDic = [[NSMutableDictionary alloc] initWithCapacity:16];
    [binaryDic setObject:@"0" forKey:@"0000"];
    [binaryDic setObject:@"1" forKey:@"0001"];
    [binaryDic setObject:@"2" forKey:@"0010"];
    [binaryDic setObject:@"3" forKey:@"0011"];
    [binaryDic setObject:@"4" forKey:@"0100"];
    [binaryDic setObject:@"5" forKey:@"0101"];
    [binaryDic setObject:@"6" forKey:@"0110"];
    [binaryDic setObject:@"7" forKey:@"0111"];
    [binaryDic setObject:@"8" forKey:@"1000"];
    [binaryDic setObject:@"9" forKey:@"1001"];
    [binaryDic setObject:@"A" forKey:@"1010"];
    [binaryDic setObject:@"B" forKey:@"1011"];
    [binaryDic setObject:@"C" forKey:@"1100"];
    [binaryDic setObject:@"D" forKey:@"1101"];
    [binaryDic setObject:@"E" forKey:@"1110"];
    [binaryDic setObject:@"F" forKey:@"1111"];
 
    if (binary.length % 4 != 0) {
 
        NSMutableString *mStr = [[NSMutableString alloc]init];;
        for (int i = 0; i < 4 - binary.length % 4; i++) {
 
            [mStr appendString:@"0"];
        }
        binary = [mStr stringByAppendingString:binary];
    }
    NSString *hex = @"";
    for (int i=0; i<binary.length; i+=4) {
 
        NSString *key = [binary substringWithRange:NSMakeRange(i, 4)];
        NSString *value = [binaryDic objectForKey:key];
        if (value) {
 
            hex = [hex stringByAppendingString:value];
        }
    }
    return hex;
}

二进制转换为十进制

/**
 二进制转换为十进制
 @param binary 二进制数
 @return 十进制数
 */
+ (NSInteger)getDecimalByBinary:(NSString *)binary {
 
    NSInteger decimal = 0;
    for (int i=0; i<binary.length; i++) {
 
        NSString *number = [binary substringWithRange:NSMakeRange(binary.length - i - 1, 1)];
        if ([number isEqualToString:@"1"]) {
 
            decimal += pow(2, i);
        }
    }
    return decimal;
}

16进制NSData 转 16进制字符串

/**
 16进制NSData 转 16进制字符串
 @param data data
 @return hex字符串
*/
+ (NSString *)transformStringWithData:(NSData *)data{
   NSString *result;
  const unsigned char *dataBuffer = (const unsigned char *)[data bytes];
  if (!dataBuffer) {
      return nil;
  }
  NSUInteger dataLength = [data length];
  NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; i++) {
      //02x 表示两个位置 显示的16进制
      [hexString appendString:[NSString stringWithFormat:@"%02lx",(unsigned long)dataBuffer[i]]];
  }
  result = [NSString stringWithString:hexString];
  
  return result;
}

data 转 hex字符串

/**
 data 转 字符串
 @param data data
 @return hex字符串
 */
+ (NSString *)convertDataToHexStr:(NSData *)data{
    if (!data || [data length] == 0) {
        return @"";
    }
    NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
    
    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
            if ([hexStr length] == 2) {
                [string appendString:hexStr];
            } else {
                [string appendFormat:@"0%@", hexStr];
            }
        }
    }];
    
    return string;
}

16进制字符串转的16进制NSData

/**
 16进制字符串转的16进制NSData
 @param hexStr 16进制字符串
 @return 16进制NSData
*/

+ (NSData *)dataOfHexString:(NSString *)hexStr {

    NSInteger hexLength = [hexStr length];
    if (!hexStr || hexLength == 0) {
        return [NSData data];
    }

    hexLength = [hexStr length];
    NSMutableData *mHexData = [NSMutableData data];
    NSRange range;

    if (hexLength % 2 == 0) {
        range = NSMakeRange(0, 2);
    } else {
        // 奇数情况 给低位数值预留出2的倍数
        range = NSMakeRange(0, 1);
    }

    for (NSInteger i = range.location; i < hexLength; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [hexStr substringWithRange:range];
        if ([hexCharStr isEqualToString:@"0x"]) {
            // 去除0x
            range.location += range.length;
            range.length = 2;
            continue;
        }

        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];

        // Scans for an unsigned value from a hexadecimal representation, returning a found value by reference.
        [scanner scanHexInt:&anInt];
        NSData *data = [[NSData alloc] initWithBytes:&anInt length:1];
        [mHexData appendData:data];
        range.location += range.length;
        range.length = 2;
    }
    return [mHexData copy];
}

获取外设Mac地址

根据自己情况做对应修改

/**
 获取外设Mac地址
 @param aString 字符串
*/
- (NSString *)macAddressWith:(NSString *)aString{
    NSMutableString *macString = [[NSMutableString alloc] init];
    if (aString.length >= 12) {
        [macString appendString:[[aString substringWithRange:NSMakeRange(0, 2)] uppercaseString]];
        [macString appendString:@":"];
        [macString appendString:[[aString substringWithRange:NSMakeRange(2, 2)] uppercaseString]];
        [macString appendString:@":"];
        [macString appendString:[[aString substringWithRange:NSMakeRange(4, 2)] uppercaseString]];
        [macString appendString:@":"];
        [macString appendString:[[aString substringWithRange:NSMakeRange(6, 2)] uppercaseString]];
        [macString appendString:@":"];
        [macString appendString:[[aString substringWithRange:NSMakeRange(8, 2)] uppercaseString]];
        [macString appendString:@":"];
        [macString appendString:[[aString substringWithRange:NSMakeRange(10, 2)] uppercaseString]];
    }
    NSLog(@"macString:%@",macString);
    return macString;
    
}

int转NSData

- (NSData *) setId:(int)Id {
    //用4个字节接收
    Byte bytes[4];
    bytes[0] = (Byte)(Id>>24);
    bytes[1] = (Byte)(Id>>16);
    bytes[2] = (Byte)(Id>>8);
    bytes[3] = (Byte)(Id);
    NSData *data = [NSData dataWithBytes:bytes length:4];
}

NSData转int 接受到的数据0x00000a0122

//4字节表示的int
NSData *intData = [data subdataWithRange:NSMakeRange(2, 4)];
int value = CFSwapInt32BigToHost(*(int*)([intData bytes]));//655650
//2字节表示的int
NSData *intData = [data subdataWithRange:NSMakeRange(4, 2)];
int value = CFSwapInt16BigToHost(*(int*)([intData bytes]));//290
//1字节表示的int
char *bs = (unsigned char *)[[data subdataWithRange:NSMakeRange(5, 1) ] bytes];
int value = *bs;//34