TLSTool/QHex.m
/* |
Copyright (C) 2016 Apple Inc. All Rights Reserved. |
See LICENSE.txt for this sample’s licensing information |
Abstract: |
Hex dump utilities. |
*/ |
#import "QHex.h" |
@implementation QHex |
+ (NSString *)hexStringWithBytes:(const void *)bytes length:(NSUInteger)length { |
NSMutableString * result; |
const uint8_t * base; |
NSParameterAssert(bytes != NULL); |
// length can be 0 |
base = bytes; |
result = [[NSMutableString alloc] initWithCapacity:length * 2]; |
for (NSUInteger i = 0; i < length; i++) { |
[result appendFormat:@"%02x", base[i]]; |
} |
return result; |
} |
+ (NSString *)hexStringWithData:(NSData *)data { |
static const uint8_t dummy = 0; |
const void * bytes; |
NSParameterAssert(data != nil); |
// *grrr* -[NSData bytes] can return NULL if the data is empty, but |
// +hexStringWithBytes:length: requires a non-NULL value. |
bytes = data.bytes; |
if (bytes == NULL) { |
assert(data.length == 0); |
bytes = &dummy; |
} |
return [[self class] hexStringWithBytes:bytes length:data.length]; |
} |
+ (NSData *)dataWithValidHexString:(NSString *)hexString { |
NSData * result; |
result = [[self class] dataWithHexString:hexString]; |
NSParameterAssert(result != nil); |
return result; |
} |
+ (nullable NSData *)dataWithHexString:(NSString *)hexString { |
NSMutableData * result; |
NSUInteger cursor; |
NSUInteger limit; |
NSParameterAssert(hexString != nil); |
cursor = 0; |
limit = hexString.length; |
if ((limit % 2) != 0) { |
result = nil; |
} else { |
result = [[NSMutableData alloc] initWithCapacity:limit / 2]; |
while (cursor != limit) { |
unsigned int thisUInt; |
uint8_t thisByte; |
if ( sscanf([[hexString substringWithRange:NSMakeRange(cursor, 2)] UTF8String], "%x", &thisUInt) != 1 ) { |
result = nil; |
break; |
} |
thisByte = (uint8_t) thisUInt; |
[result appendBytes:&thisByte length:sizeof(thisByte)]; |
cursor += 2; |
} |
} |
return result; |
} |
@end |
Copyright © 2016 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2016-05-23