前提:
最近开发蓝牙项目,收集的一些 数据进制转换方法。有一些是自己使用过的,没问题,有些并未使用到, 如有错误,敬请原谅!
十六进制转换为二进制
/**
十六进制转换为二进制
@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