Adds utility functions to NSData, that help deal with null termination of C strings.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

NSData+SA_NSDataExtensions.m 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 *) SA_terminatedCString {
  14. return self.SA_dataWithTerminatedCString.bytes;
  15. }
  16. -(NSData *) SA_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. -(const char *) SA_unterminatedByteString {
  33. return self.SA_dataWithUnterminatedByteString.bytes;
  34. }
  35. -(NSData *) SA_dataWithUnterminatedByteString {
  36. if (self.length == 0 || self.isNullTerminated == NO) {
  37. return self;
  38. } else {
  39. char* unterminated_string_buffer = malloc(self.length - 1);
  40. [self getBytes:unterminated_string_buffer length:self.length - 1];
  41. return [NSData dataWithBytesNoCopy:unterminated_string_buffer
  42. length:(self.length - 1)
  43. freeWhenDone:YES];
  44. }
  45. }
  46. +(NSData *) dataWithBlankCString {
  47. return [NSData dataWithBytes:"\0"
  48. length:1];
  49. }
  50. +(NSData *) dataFromCString:(const char *)cString {
  51. return [NSData dataWithBytes:cString
  52. length:strlen(cString)];
  53. }
  54. +(NSData *) dataWithCString:(char *)cString {
  55. return [NSData dataWithBytesNoCopy:cString
  56. length:strlen(cString)];
  57. }
  58. @end