2012-12-05 1 views
1

J'ai utilisé cette fonction pour le cryptage 3des.Dans ios 3des le cryptage contient beaucoup de terminaison nulle. Quand je convertis NSData à NSString, il terminera à la première annulation nulle?

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];' 

Bien que cela fonctionne. mais quand je convertis convertir ce NSData en NSString, parce que le NSString contient beaucoup de terminaison nulle, NSString finissent à la première fin nulle, la variable n'est pas capable de contenir l'ensemble des données. mais je dois envoyer une chaîne cryptée sur le serveur. que puis-je faire pour convertir NSData en NSString. chaîne qui contient tous les moyens de données (si les données contiennent une terminaison nulle, la chaîne ne se terminera pas dans ce cas)?

Veuillez nous aider Merci d'avance.


merci pour la réponse, regard si l'octet chiffré contiennent

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]; 

lorsque nous convertissons ces NSData à NSString. il finira le premier \ 0 (terminaison nulle) parce que nous devons envoyer NSString.so chiffré il fait problème. et je ne peux pas envoyer le base64string parce que le côté de serveur ne veut pas that.they ont demandé la chaîne de cryptage.

donc ce que je fais maintenant, s'il vous plaît aider et merci encore pour répondre monsieur,

+0

où est la question (et le point d'interrogation) dans cette question? –

Répondre

0

Conversion NSData-NSString ne pas arrêt à octets nuls. Un NSString peut contenir des caractères Unicode arbitraires, y compris des caractères "NULL" incorporés.

Exemple:

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); 

Sortie:

Hello 

Il semble comme si la chaîne ne contient que 5 caractères et la conversion arrêté au premier octet nul. Mais ce n'est que la sortie NSLog, en fait rien est perdu:

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

Sortie:

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, 

Ainsi, la chaîne contient toutes les données et rien ne se perd. Probablement la chaîne est tronquée plus tard, lorsque vous l'envoyez au serveur.


REMARK: Conversion des données cryptées à une chaîne me semble problématique, car les données sont interprétées dans un codage de caractères. J'ai choisi NSASCIIStringEncoding dans cet exemple, mais selon la documentation, ce codage n'est valide que pour les valeurs ASCII 0 ... 127.

Si vous ajoutez plus d'informations sur comment et dans quel format les données cryptées sont envoyées au serveur, nous pourrions être en mesure de faire des suggestions pour mieux résoudre le problème.

+0

veuillez voir la réponse dans la réponse suivante –

+0

@Nitishbhatia: Quel protocole est utilisé pour envoyer les données au serveur? Le protocole autorise-t-il les octets nuls incorporés? –

Questions connexes