16進(jìn)制編碼,轉(zhuǎn)成字符串
+ (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進(jìn)制編碼逆過程
+ (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];
}
總結(jié)
無意中搜到了C函數(shù) digittoint,已經(jīng)可以把16進(jìn)制字符轉(zhuǎn)成數(shù)值,所以欣喜之余,發(fā)現(xiàn)可以拋棄網(wǎng)上的NSScaner方案(不斷構(gòu)造新scanner來解析)。如果剛好你看到,覺得有用,那就留個(gè)贊。:)