数据流的16进制高效编码

16进制编码,转成字符串
+ (NSString *)hexStringForData:(NSData *)data {
    static const u_char HexCharMap[] = "0123456789abcdef";
    Byte* bytes = (Byte*) [self bytes];
    Byte* bytesHex = (Byte*) malloc([self length]*2);
    for (NSUInteger i = 0, j = 0; i < [self length]; i++, j+=2) {
        bytesHex[j+1] = HexCharMap[ bytes[i] & 0x0f ];
        bytesHex[j  ] = HexCharMap[(bytes[i] & 0xf0) >> 4];
    }
    return [[NSString alloc] initWithBytesNoCopy:bytesHex length:[self length]*2 encoding:(NSASCIIStringEncoding) freeWhenDone:YES];
}
16进制编码逆过程
+ (NSData *)dataFromHexString:(NSString *)hexString {
    NSUInteger size = [hexString length] / 2;
    Byte* result = (Byte*) malloc(size);
    bzero(result, size);
    const char * cstring = [hexString cStringUsingEncoding:NSUTF8StringEncoding];
    for (int i = 0, j = 0; i < size; i++, j += 2) {
        result[i] = (Byte) ((digittoint(cstring[j]) << 4)  | digittoint(cstring[j+1]));
    }
    
    return [NSData dataWithBytesNoCopy: result length:size freeWhenDone:YES];
}

总结

无意中搜到了C函数 digittoint,已经可以把16进制字符转成数值,所以欣喜之余,发现可以抛弃网上的NSScaner方案(不断构造新scanner来解析)。如果刚好你看到,觉得有用,那就留个赞。:)

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

推荐阅读更多精彩内容

  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,516评论 1 20
  • 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是...
    艾小天儿阅读 17,596评论 0 2
  • 很多人总把心里美好的愿望自以为真,就比如我们所知的"一别两宽,各生欢喜"。其实在一起的所走过的路上,但凡有过真...
    b919530e3bc6阅读 306评论 0 0
  • 孔空回到山上,看着孩子们嗷嗷待哺的眼神,心里顿生出许多悲凉。这万物天地啊,竟然让自己到了这般走投无路的田地。他做了...
    三更笙阅读 205评论 0 1
  • 关于坚持!有一段白眼狼太多,也懒得写到各处!友人鼎力才安抚我那小情绪! 很多人以为我坚持了就这一年光景! 这才是九...
    纵情嬉戏天地间阅读 224评论 7 0