NSString(十六进制)到字节

AOO*_*AOO 20 hex byte objective-c nsstring

Objective-C中是否有将十六进制字符串转换为字节的方法?例如@"1156FFCD3430AA22"一个unsigned char array {0x11, 0x56, 0xFF, ...}.

Zyp*_*rax 42

我能想到的最快的NSString类别实现(一些示例的鸡尾酒):

- (NSData *)dataFromHexString {
    const char *chars = [self UTF8String];
    int i = 0, len = self.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;
}
Run Code Online (Sandbox Code Playgroud)

它比wookay的解决方案快8倍.NSScanner非常慢.

  • +1这似乎更好 - 不仅更快,但这**实际上是正确的.** (3认同)

小智 21

@interface NSString (NSStringHexToBytes)
-(NSData*) hexToBytes ;
@end



@implementation NSString (NSStringHexToBytes)
-(NSData*) hexToBytes {
  NSMutableData* data = [NSMutableData data];
  int idx;
  for (idx = 0; idx+2 <= self.length; idx+=2) {
    NSRange range = NSMakeRange(idx, 2);
    NSString* hexStr = [self substringWithRange:range];
    NSScanner* scanner = [NSScanner scannerWithString:hexStr];
    unsigned int intValue;
    [scanner scanHexInt:&intValue];
    [data appendBytes:&intValue length:1];
  }
  return data;
}
@end



/// example
unsigned char bytes[] = { 0x11, 0x56, 0xFF, 0xCD, 0x34, 0x30, 0xAA, 0x22 };
NSData* expectedData = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"data %@", [@"1156FFCD3430AA22" hexToBytes]);
NSLog(@"expectedData isEqual:%d", [expectedData isEqual:[@"1156FFCD3430AA22" hexToBytes]]);
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请纠正我,但我认为[data appendBytes:&intValue length:1]有些麻烦.类型unsigned int至少有四个字符宽(至少保持32位).&intValue是指向四个中的第一个的指针.这意味着在小端系统上,&intValue将成为指向您刚扫描的char的指针.但是在大端架构上,它总是指向零值,因为该值存储为四个字符中的最后一个.基本上这意味着这段代码可以在Mac上运行并在iOS上中断. (5认同)
  • 这个答案有很多缺陷.它不仅将`int`视为一个字节(根据C标准这是不可能的),但它只是多余地生成了很多子字符串,而不是仅仅遍历`const char*`可以获得使用`UTF8String` ... (2认同)

Mar*_*c W 2

不是以你正在做的方式。您需要编写自己的方法来获取每两个字符,将它们解释为 int,并将它们存储在数组中。