|
@@ -1557,4 +1557,29 @@
|
|
|
return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, str, NULL, charset, encoding));
|
|
|
}
|
|
|
|
|
|
++ (NSString*)hexRepresentation:(NSData *)data spaces:(BOOL)spaces
|
|
|
+{
|
|
|
+ const unsigned char* bytes = (const unsigned char*)[data bytes];
|
|
|
+ NSUInteger nbBytes = [data length];
|
|
|
+ //If spaces is true, insert a space every this many input bytes (twice this many output characters).
|
|
|
+ static const NSUInteger spaceEveryThisManyBytes = 4UL;
|
|
|
+ //If spaces is true, insert a line-break instead of a space every this many spaces.
|
|
|
+ static const NSUInteger lineBreakEveryThisManySpaces = 4UL;
|
|
|
+ const NSUInteger lineBreakEveryThisManyBytes = spaceEveryThisManyBytes * lineBreakEveryThisManySpaces;
|
|
|
+ NSUInteger strLen = 2*nbBytes + (spaces ? nbBytes/spaceEveryThisManyBytes : 0);
|
|
|
+
|
|
|
+ NSMutableString* hex = [[NSMutableString alloc] initWithCapacity:strLen];
|
|
|
+ for(NSUInteger i=0; i<nbBytes; ) {
|
|
|
+ [hex appendFormat:@"%02X", bytes[i]];
|
|
|
+ //We need to increment here so that the every-n-bytes computations are right.
|
|
|
+ ++i;
|
|
|
+
|
|
|
+ if (spaces) {
|
|
|
+ if (i % lineBreakEveryThisManyBytes == 0) [hex appendString:@"\n"];
|
|
|
+ else if (i % spaceEveryThisManyBytes == 0) [hex appendString:@" "];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return hex;
|
|
|
+}
|
|
|
+
|
|
|
@end
|