Преобразование массива беззнаковых символов C с заканчивающимся нулем символом в середине в Objective-C NSString

В приложении iOS я использую сторонний SDK, написанный на C. В результате вызова метода SDK я получаю массив unsigned char (см. пример ниже).

Мне нужно преобразовать этот массив в строку Objective-C (NSString), чтобы сохранить его, а затем преобразовать обратно в C, чтобы передать его в качестве параметра другому методу SDK.


Я видел несколько способов преобразовать строку C в Objective-C.

NSString *example1 = [NSString stringWithFormat:@"%s", myArray]; // "8oFDO{c."rägÕªö"
NSString *example2 = [[NSString alloc] initWithBytes:myArray length:sizeof(myArray) encoding:NSASCIIStringEncoding]; // "8oFDO{c."rägÕªö"
...

Но ни один из них, кажется, не допускает \0 (символ, завершающий нуль) в середине (см. [29] в примере ниже).


Пример ответа массива символов без знака:

{
  [0] = '8'
  [1] = '\b'
  [2] = '\x01'
  [3] = 'o'
  [4] = '\x01'
  [5] = '\x03'
  [6] = 'F'
  [7] = 'D'
  [8] = 'O'
  [9] = '\x02'
  [10] = '\x10'
  [11] = '\x0e'
  [12] = '{'
  [13] = '\x8d'
  [14] = 'c'
  [15] = '.'
  [16] = '\x19'
  [17] = '"'
  [18] = 'r'
  [19] = '\xe4'
  [20] = 'g'
  [21] = '\x18'
  [22] = '\xd5'
  [23] = '\xaa'
  [24] = '\xf6'
  [25] = '\x95'
  [26] = '\x18'
  [27] = '\x03'
  [28] = '\x01'
  [29] = '\0'
  [30] = '\x04'
  [31] = '\x01'
  [32] = '\x05'
  [33] = '\x05'
  [34] = '\x01'
  [35] = '\x05'
  [36] = '\x06'
  [37] = '\x01'
  [38] = '\x01'
  ...
}

Как я могу преобразовать C в Objective-C, а затем обратно из Objective-C в C?


person yonicsurny    schedule 20.06.2017    source источник
comment
stackoverflow.com/ вопросы/3949628/ ? Но вы потеряете тот факт, что byte[29] имеет \0 (если вы хотите преобразовать его обратно), поэтому просто сохраните массив байтов?   -  person Larme    schedule 20.06.2017
comment
Я вижу другие решения, такие как stackoverflow.com/a/6093939/1197572 замена \0 на \\0.   -  person yonicsurny    schedule 20.06.2017
comment
этот массив unsigned char вообще не является строкой. Вы должны обращаться с ним так, как будто это void *, и использовать NSData для хранения таких аргументов.   -  person toma    schedule 20.06.2017
comment
@AndrewTomenko, возможно, вы что-то поняли, сохранив его в NSData и преобразовав обратно в массив беззнаковых символов, я получаю тот же результат, что и исходное значение, которое многообещающе. Я не могу проверить сегодня, но я сделаю это завтра и сообщу результат. Спасибо :-)   -  person yonicsurny    schedule 20.06.2017
comment
@AndrewTomenko заставил это работать. Спасибо за понимание!   -  person yonicsurny    schedule 21.06.2017


Ответы (1)


Этот массив unsigned char вообще не является строкой. Вы должны обращаться с ним так, как будто это void *, и использовать NSData для хранения таких аргументов.

person toma    schedule 21.06.2017