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 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // NSData+SA_NSDataExtensions.m
  3. //
  4. // Copyright (c) 2015 Said Achmiz.
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in all
  14. // copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22. // SOFTWARE.
  23. #import "NSData+SA_NSDataExtensions.h"
  24. @implementation NSData (SA_NSDataExtensions)
  25. -(BOOL) isNullTerminated {
  26. if (self.length == 0)
  27. return NO;
  28. return (((char*) self.bytes)[self.length - 1] == '\0');
  29. }
  30. -(const char *) SA_terminatedCString {
  31. return self.SA_dataWithTerminatedCString.bytes;
  32. }
  33. -(NSData *) SA_dataWithTerminatedCString {
  34. if (self.length == 0) {
  35. return [NSData dataWithBytes:"\0"
  36. length:1];
  37. } else if (self.isNullTerminated) {
  38. return self;
  39. } else {
  40. char* terminated_string_buffer = malloc(self.length + 1);
  41. [self getBytes:terminated_string_buffer
  42. length:self.length];
  43. terminated_string_buffer[self.length] = '\0';
  44. return [NSData dataWithBytesNoCopy:terminated_string_buffer
  45. length:(self.length + 1)
  46. freeWhenDone:YES];
  47. }
  48. }
  49. -(const char *) SA_unterminatedByteString {
  50. return self.SA_dataWithUnterminatedByteString.bytes;
  51. }
  52. -(NSData *) SA_dataWithUnterminatedByteString {
  53. if (self.length == 0 || self.isNullTerminated == NO) {
  54. return self;
  55. } else {
  56. char* unterminated_string_buffer = malloc(self.length - 1);
  57. [self getBytes:unterminated_string_buffer length:self.length - 1];
  58. return [NSData dataWithBytesNoCopy:unterminated_string_buffer
  59. length:(self.length - 1)
  60. freeWhenDone:YES];
  61. }
  62. }
  63. +(NSData *) dataWithBlankCString {
  64. return [NSData dataWithBytes:"\0"
  65. length:1];
  66. }
  67. +(NSData *) dataFromCString:(const char *)cString {
  68. return [NSData dataWithBytes:cString
  69. length:strlen(cString)];
  70. }
  71. +(NSData *) dataWithCString:(char *)cString {
  72. return [NSData dataWithBytesNoCopy:cString
  73. length:strlen(cString)];
  74. }
  75. @end