iOS数据转换面试题

将一串表示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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,382评论 30 472
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,002评论 18 399
  • 天气晴,微风,阳光普照。 心情不是太好的时候总喜欢写点东西,来分散注意力,以平复不佳的情绪。可是状态不错的时候,却...
    懒懒的树袋熊go阅读 1,092评论 0 0
  • 编辑 httpd.conf Win32DisableAcceptEx ##在文件尾加入这行 重启apache就解决...
    f675b1a02698阅读 4,962评论 0 0
  • 是否在为今天手头紧张而痛心疾首?看着别人有房有车,自己却一无所获,心里想必不是滋味吧! 那么好,钱不是问题! 假设...
    存钱罐子阅读 3,950评论 0 0