Adds utility functions to NSData, that help deal with null termination of C strings.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

NSData+SA_NSDataExtensions.m 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // NSData+SA_NSDataExtensions.m
  3. //
  4. // Copyright 2015-2021 Said Achmiz.
  5. // See LICENSE and README.md for more info.
  6. #import "NSData+SA_NSDataExtensions.h"
  7. @implementation NSData (SA_NSDataExtensions)
  8. -(BOOL) isNullTerminated {
  9. if (self.length == 0)
  10. return NO;
  11. return (((char*) self.bytes)[self.length - 1] == '\0');
  12. }
  13. -(const char *) terminatedCString {
  14. return self.dataWithTerminatedCString.bytes;
  15. }
  16. -(NSData *) dataWithTerminatedCString {
  17. if (self.length == 0) {
  18. return [NSData dataWithBytes:"\0"
  19. length:1];
  20. } else if (self.isNullTerminated) {
  21. return self;
  22. } else {
  23. char* terminated_string_buffer = malloc(self.length + 1);
  24. [self getBytes:terminated_string_buffer
  25. length:self.length];
  26. terminated_string_buffer[self.length] = '\0';
  27. return [NSData dataWithBytesNoCopy:terminated_string_buffer
  28. length:(self.length + 1)
  29. freeWhenDone:YES];
  30. }
  31. }
  32. -(NSRange) startRange {
  33. return NSMakeRange(0, 0);
  34. }
  35. -(NSRange) fullRange {
  36. return NSMakeRange(0, self.length);
  37. }
  38. -(NSRange) endRange {
  39. return NSMakeRange(self.length, 0);
  40. }
  41. -(NSRange) rangeAfterRange:(NSRange)aRange {
  42. return NSMakeRange(NSMaxRange(aRange), self.length - NSMaxRange(aRange));
  43. }
  44. -(NSRange) rangeFromEndOfRange:(NSRange)aRange {
  45. return NSMakeRange(NSMaxRange(aRange) - 1, self.length - NSMaxRange(aRange) + 1);
  46. }
  47. -(NSRange) rangeToEndFrom:(NSRange)aRange {
  48. return NSMakeRange(aRange.location, self.length - aRange.location);
  49. }
  50. +(NSData *) dataWithBlankCString {
  51. return [NSData dataWithBytes:"\0"
  52. length:1];
  53. }
  54. +(NSData *) dataFromCString:(const char *)cString {
  55. return [NSData dataWithBytes:cString
  56. length:strlen(cString)];
  57. }
  58. +(NSData *) dataWithCString:(char *)cString {
  59. return [NSData dataWithBytesNoCopy:cString
  60. length:strlen(cString)];
  61. }
  62. @end