2 // NSData+SA_NSDataExtensions.m
4 // Copyright 2015-2021 Said Achmiz.
5 // See LICENSE and README.md for more info.
7 #import "NSData+SA_NSDataExtensions.h"
9 @implementation NSData (SA_NSDataExtensions)
11 -(BOOL) isNullTerminated {
15 return (((char*) self.bytes)[self.length - 1] == '\0');
18 -(const char *) terminatedCString {
19 return self.dataWithTerminatedCString.bytes;
22 -(NSData *) dataWithTerminatedCString {
23 if (self.length == 0) {
24 return [NSData dataWithBytes:"\0"
26 } else if (self.isNullTerminated) {
29 char* terminated_string_buffer = malloc(self.length + 1);
30 [self getBytes:terminated_string_buffer
32 terminated_string_buffer[self.length] = '\0';
34 return [NSData dataWithBytesNoCopy:terminated_string_buffer
35 length:(self.length + 1)
40 -(NSRange) startRange {
41 return NSMakeRange(0, 0);
44 -(NSRange) fullRange {
45 return NSMakeRange(0, self.length);
49 return NSMakeRange(self.length, 0);
52 -(NSRange) rangeAfterRange:(NSRange)aRange {
53 return NSMakeRange(NSMaxRange(aRange), self.length - NSMaxRange(aRange));
56 -(NSRange) rangeFromEndOfRange:(NSRange)aRange {
57 return NSMakeRange(NSMaxRange(aRange) - 1, self.length - NSMaxRange(aRange) + 1);
60 -(NSRange) rangeToEndFrom:(NSRange)aRange {
61 return NSMakeRange(aRange.location, self.length - aRange.location);
64 +(NSData *) dataWithBlankCString {
65 return [NSData dataWithBytes:"\0"
69 +(NSData *) dataFromCString:(const char *)cString {
70 return [NSData dataWithBytes:cString
71 length:strlen(cString)];
74 +(NSData *) dataWithCString:(char *)cString {
75 return [NSData dataWithBytesNoCopy:cString
76 length:strlen(cString)];