将一串表示16进制的字符串转换成NSData
/**
将16进制字符串转换成data值和字符串字符相等的NSData
比如输入@"3e435fab9c34891f"
输出的NSData的byte是3e435fab9c34891f
@param hexString 16进制字符串
@return 转换后NSData
*/
static NSData* dataWithHexString(NSString *hexString) {
hexString = [hexString stringByReplacingOccurrencesOfString:@" " withString:@""];
// 将16进制数据转化成Byte 数组
NSUInteger bytesCount = hexString.length / 2;
Byte bytes[bytesCount];
for(int i = 0; i < [hexString length]; i++)
{
int int_ch; /// 两位16进制数转化后的10进制数
unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)
int int_ch1;
if(hex_char1 >= '0' && hex_char1 <='9')
int_ch1 = (hex_char1 - '0') << 4; //// 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch1 = (hex_char1 - 65 + 10) << 4; //// A 的Ascll - 65, 26个大写字母
else
int_ch1 = (hex_char1 - 97 + 10) << 4; //// a 的Ascll - 97, 26个小写字母
i++;
unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)
int int_ch2;
if(hex_char2 >= '0' && hex_char2 <='9')
int_ch2 = (hex_char2 - 48); //// 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch2 = (hex_char2 - 65) + 10; //// A 的Ascll - 65
else
int_ch2 = (hex_char2 - 97) + 10; //// a 的Ascll - 97
int_ch = int_ch1 + int_ch2;
NSLog(@"int_ch=%d",int_ch);
bytes[i/2] = int_ch; ///将转化后的数放入Byte数组里
}
NSData *newData = [[NSData alloc] initWithBytes:bytes length:bytesCount];
NSLog(@"newData=%@",newData);
return newData;
}
YYKit里面也有相应的处理方法
+ (NSData *)dataWithHexString:(NSString *)hexStr {
hexStr = [hexStr stringByReplacingOccurrencesOfString:@" " withString:@""];
hexStr = [hexStr lowercaseString];
NSUInteger len = hexStr.length;
if (!len) return nil;
unichar *buf = malloc(sizeof(unichar) * len);
if (!buf) return nil;
[hexStr getCharacters:buf range:NSMakeRange(0, len)]; // 把char存入buf
NSMutableData *result = [NSMutableData data];
unsigned char bytes;
char str[3] = { '\0', '\0', '\0' };
int i;
for (i = 0; i < len / 2; i++) {
str[0] = buf[i * 2];// 高4位
str[1] = buf[i * 2 + 1]; // 低4位
bytes = strtol(str, NULL, 16); // 将串转换为长整数
[result appendBytes:&bytes length:1];
}
free(buf);
return result;
}
网友评论