В шифровании ios 3des содержится много нулевого завершения. Когда я конвертирую NSData в NSString, оно закончится первым нулевым завершением?

Я использовал эту функцию для шифрования 3des.

 ccStatus = CCCrypt(kCCEncrypt,              // CCoperation op
                       kCCAlgorithm3DES,        // CCAlgorithm alg
                       kCCOptionPKCS7Padding,  // kCCOptionPKCS7Padding,                    //kCCModeECB,              // CCOptions
                       [_keyData bytes],        // const void *key
                       kCCKeySize3DES,          // 3DES key size length 24 bit
                       vinitVec,              //iv,                      // const void *iv,
                       [dTextIn bytes],         // const void *dataIn 
                       [dTextIn length],        // size_t dataInLength
                       bufferPtr,               // void *dataOut
                       bufferPtrSize,           // size_t dataOutAvailable
                       &movedBytes);            // size_t *dataOutMoved
       NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];'

Хотя он работает. но когда я конвертирую этот NSData в NSString , поскольку NSString содержит много нулевых завершений, NSString заканчивается при первом нулевом завершении, переменная не может содержать все данные. но я должен отправить зашифрованную строку на сервер. что я могу сделать, чтобы преобразовать NSData в NSString. строка, содержащая все данные означает (если данные содержат нулевое завершение, в этом случае строка не закончится)?

Пожалуйста, помогите Заранее спасибо.


спасибо за ответ, посмотрите, содержит ли зашифрованный байт

 char bytes[] = { 'H', 'e', 'l', 'l', 'o', \0, 'W', 'o', 'r', 'l', 'd', \0 };
   NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
   NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
   NSLog(@"%@", str);

   NSString *sendtoserver=[NSString stringwithformat:@"<request>%@</request>",str];

когда мы конвертируем эти NSData в NSString. он закончится первым \0 (нулевое завершение), потому что мы должны отправить зашифрованный NSString. Поэтому это создает проблему. и я не могу отправить строку base64, потому что серверная сторона этого не хочет. Они просили строку шифрования.

так что я делаю сейчас, пожалуйста, помогите и еще раз спасибо за ответ, сэр,


person Nitish bhatia    schedule 05.12.2012    source источник
comment
где вопрос (и вопросительный знак) в этом вопросе?   -  person Michael Dautermann    schedule 05.12.2012


Ответы (1)


Преобразование NSData в NSString не останавливается на нулевых байтах. NSString может содержать произвольные символы Юникода, включая встроенные символы «NULL».

Пример:

char bytes[] = { 'H', 'e', 'l', 'l', 'o', 0, 'W', 'o', 'r', 'l', 'd', 0 };
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);

Вывод:

Hello

Таким образом, выглядит так, как если бы строка содержала только 5 символов, а преобразование остановилось на первом нулевом байте. Но это только вывод NSLog, на самом деле ничего не теряется:

for (int i = 0; i < [str length]; i++) {
    unichar c = [str characterAtIndex:i];
    NSLog(@"%2d, %3d, %c", i, c, c);
}

Вывод:

  0,  72, H
  1, 101, e
  2, 108, l
  3, 108, l
  4, 111, o
  5,   0, 
  6,  87, W
  7, 111, o
  8, 114, r
  9, 108, l
 10, 100, d
 11,   0, 

Таким образом, строка содержит все данные и ничего не теряется. Вероятно, строка обрезается позже, когда вы отправляете ее на сервер.


ПРИМЕЧАНИЕ: Преобразование зашифрованных данных в строку кажется мне проблематичным, поскольку данные интерпретируются в некоторой кодировке символов. В этом примере я выбрал NSASCIIStringEncoding, но, согласно документации, эта кодировка действительна только для значений ASCII 0…127.

Если вы добавите дополнительную информацию о том, как и в каком формате зашифрованные данные отправляются на сервер, мы могли бы предложить, как лучше решить эту проблему.

person Martin R    schedule 05.12.2012
comment
пожалуйста, смотрите ответ в следующем ответе - person Nitish bhatia; 06.12.2012
comment
@Nitishbhatia: Какой протокол используется для отправки данных на сервер? Разрешает ли протокол встроенные нулевые байты? - person Martin R; 06.12.2012