首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSString (十六进制)到字节

NSString (十六进制)到字节
EN

Stack Overflow用户
提问于 2010-03-23 23:14:52
回答 6查看 29.2K关注 0票数 22

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

EN

回答 6

Stack Overflow用户

发布于 2013-07-07 19:05:31

我能想到的最快的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;
}

它比wookay的解决方案快近8倍。NSScanner相当慢。

票数 42
EN

Stack Overflow用户

发布于 2010-03-24 13:31:57

@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]]);
票数 21
EN

Stack Overflow用户

发布于 2010-03-23 23:24:22

NSScannerscanHexInt:和类似方法可能有助于完成您想要的操作,但您可能需要首先将字符串拆分成更小的块,在这种情况下,手动执行转换可能比使用NSScanner更简单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2501033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档