-
Notifications
You must be signed in to change notification settings - Fork 3
/
NSData+RSHexDump.m
74 lines (61 loc) · 2.19 KB
/
NSData+RSHexDump.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//
// NSData+RSHexDump.m
// RSFoundation
//
// Created by Daniel Jalkut on 2/14/07.
// Copyright 2007 Red Sweater Software. All rights reserved.
//
// Based on code from Dan Wood
// http://gigliwood.com/weblog/Cocoa/Better_description_.html
//
//
#import "NSData+RSHexDump.h"
const unsigned int kDefaultMaxBytesToHexDump = 1024;
@implementation NSData ( RSHexDump )
- (NSString *)description{
return [self descriptionFromOffset:0];
}
- (NSString *)descriptionFromOffset:(int)startOffset{
return [self descriptionFromOffset:startOffset limitingToByteCount:kDefaultMaxBytesToHexDump];
}
- (NSString *)descriptionFromOffset:(int)startOffset limitingToByteCount:(unsigned int)maxBytes{
unsigned char *bytes = (unsigned char *)[self bytes];
NSUInteger stopOffset = [self length];
// Translate negative offset to positive, by subtracting from end
if(startOffset < 0) startOffset = [self length] + startOffset;
// Do we have more data than the caller wants?
if((stopOffset - startOffset) > maxBytes){
stopOffset = startOffset + maxBytes;
}
// If we're showing a subset, we'll tack in info about that
NSString* curtailInfo = @"";
if((startOffset > 0) || (stopOffset < [self length])){
curtailInfo = [NSString stringWithFormat:@" (showing bytes %d through %d)", startOffset, stopOffset];
}
// Start the hexdump out with an overview of the content
NSMutableString *buf = [NSMutableString stringWithFormat:@"NSData %d bytes%@:\n", [self length], curtailInfo];
// One row of 16-bytes at a time ...
NSUInteger i, j;
for(i = startOffset ; i < stopOffset ; i += 16 ){
// Show the row in Hex first
for(j = 0 ; j < 16 ; j++){
NSUInteger rowOffset = i+j;
if(rowOffset < stopOffset) [buf appendFormat:@"%02X ", bytes[rowOffset]];
else [buf appendFormat:@" "];
}
// Now show in ASCII
[buf appendString:@"| "];
for(j = 0 ; j < 16 ; j++){
NSUInteger rowOffset = i+j;
if(rowOffset < stopOffset){
unsigned char theChar = bytes[rowOffset];
if(theChar < 32 || theChar > 127) theChar ='.';
[buf appendFormat:@"%c", theChar];
}
}
// If we're not on the last row, tack on a newline
if(i+16 < stopOffset) [buf appendString:@"\n"];
}
return buf;
}
@end