将HEX NSString转换为NSData
我试图将hexNSString
转换为NSData
(我使用下面的附加代码)。 以下是输出:
<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000>
这看起来与我完全无关。 任何想法/build议哪里出错?
NSString *strData = @"72ff63cea198b3edba8f7e0c23acc345050187a0cde5a9872cbab091ab73e553"; NSLog(@"string Data length is %d",[strData length]); NSMutableData *commandToSend= [[NSMutableData alloc] init]; unsigned char whole_byte; char byte_chars[2]; int i; for (i=0; i < [strData length]/2; i++) { byte_chars[0] = [strData characterAtIndex:i*2]; byte_chars[1] = [strData characterAtIndex:i*2+1]; whole_byte = strtol(byte_chars, NULL, [strData length]); [commandToSend appendBytes:&whole_byte length:1]; } NSLog(@"%@", commandToSend);
NSString *command = @"72ff63cea198b3edba8f7e0c23acc345050187a0cde5a9872cbab091ab73e553"; command = [command stringByReplacingOccurrencesOfString:@" " withString:@""]; NSMutableData *commandToSend= [[NSMutableData alloc] init]; unsigned char whole_byte; char byte_chars[3] = {'\0','\0','\0'}; int i; for (i=0; i < [command length]/2; i++) { byte_chars[0] = [command characterAtIndex:i*2]; byte_chars[1] = [command characterAtIndex:i*2+1]; whole_byte = strtol(byte_chars, NULL, 16); [commandToSend appendBytes:&whole_byte length:1]; } NSLog(@"%@", commandToSend);
这是另一种处理前导<
,尾随>
和embedded空格的方法
<9dc69faf a7434ba9 aef57f5c 365d571f 4c3753c4 ae13db42 57d184ca e00246c5>
码:
+ (NSData *)dataFromHexString:(NSString *)string { string = [string lowercaseString]; NSMutableData *data= [NSMutableData new]; unsigned char whole_byte; char byte_chars[3] = {'\0','\0','\0'}; int i = 0; int length = string.length; while (i < length-1) { char c = [string characterAtIndex:i++]; if (c < '0' || (c > '9' && c < 'a') || c > 'f') continue; byte_chars[0] = c; byte_chars[1] = [string characterAtIndex:i++]; whole_byte = strtol(byte_chars, NULL, 16); [data appendBytes:&whole_byte length:1]; } return data; }
这是基于@Nikunj R. Jadav的回答
这可能会更有用,苹果已经分享了一个NSData类别。
的NSData + HexString.m
代码是:
@implementation NSData (HexString) // Not efficent +(id)dataWithHexString:(NSString *)hex { char buf[3]; buf[2] = '\0'; NSAssert(0 == [hex length] % 2, @"Hex strings should have an even number of digits (%@)", hex); unsigned char *bytes = malloc([hex length]/2); unsigned char *bp = bytes; for (CFIndex i = 0; i < [hex length]; i += 2) { buf[0] = [hex characterAtIndex:i]; buf[1] = [hex characterAtIndex:i+1]; char *b2 = NULL; *bp++ = strtol(buf, &b2, 16); NSAssert(b2 == buf + 2, @"String should be all hex digits: %@ (bad digit around %d)", hex, i); } return [NSData dataWithBytesNoCopy:bytes length:[hex length]/2 freeWhenDone:YES]; } @end
我看到几个解决scheme已经发布只能够转换string甚至长度。
所以这里是我的解决scheme,它也能够返回正确的数据,如果string是奇数长度,就像这个“ DBA ”变成这样的数据这个“\ x0D \ xBA”
+ (NSData *)dataFromHexString:(NSString *) string { if([string length] % 2 == 1){ string = [@"0"stringByAppendingString:string]; } const char *chars = [string UTF8String]; int i = 0, len = (int)[string length]; NSMutableData *data = [NSMutableData dataWithCapacity:len / 2]; char byteChars[3] = {'\0','\0','\0'}; unsigned long wholeByte; while (i < len) { byteChars[0] = chars[i++]; byteChars[1] = chars[i++]; wholeByte = strtoul(byteChars, NULL, 16); [data appendBytes:&wholeByte length:1]; } return data; }