2013-08-30 1 views
0

중국어 문자가 들어있는 데이터를 암호화하려고했지만 문자열을 해독 할 때 null이 계속 발생했습니다. 내가 데이터를 암호화하는 방식은 우리의 안드로이드 팀에서 파생 된 것입니다. 그래서 그것을 똑같이 유지하고 싶습니다. 그것은 [[NSString alloc] initWithData : dataFrom64 encoding : NSUTF8StringEncoding]을 호출 할 때처럼 보입니다. 그것은 나에게 UTF8String의 NSString 표현을 준다. NSString UTF8String 호출 할 때 예기치 않은 뭔가를 반환합니다. 나는 모든 일을 인쇄해서 어디서 잘못되었는지 보려고했습니다. 엉망으로해서 미안해. 정말 도움이 필요합니다. 나는 그것을 해결하는 방법을 알아낼 수 없습니다. 여기 중국어 문자가 포함 된 경우 NSString에서 UTF8String으로 오류가 발생합니다.

NSLog(@"--------Test begins--------"); 
    NSString *chinese = @"abcd 測試"; 

    /** encrypt **/ 
    char const *testCStr = [testString UTF8String]; 
    char const *cStr = [chinese UTF8String]; 
    char *newCStr = (char*)calloc(sizeof(char), strlen(cStr)); 
    strcpy(newCStr, cStr); 

    int lenStr = strlen(cStr); 
    int lenKey = testString.length; 

    for (int i = 0, j = 0; i < lenStr; i++, j++) { 
     if (j >= lenKey) j = 0; 
     newCStr[i] = cStr[i]^testCStr[j]; 
    } 

    NSString *tempStr = [NSString stringWithUTF8String:[[NSString stringWithFormat:@"%s",newCStr] UTF8String]]; 
    NSData *tempData = [tempStr dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *base64Str = [tempData base64EncodedString]; 
    char const *dataCStr = [tempData bytes]; 
    NSString* dataToStr = [[NSString alloc] initWithData:tempData 
              encoding:NSUTF8StringEncoding]; 

    NSLog(@"chinese   : %@", chinese); 
    NSLog(@"chinese utf8 : %s ", [chinese UTF8String]); 
    NSLog(@"encrypted utf8 : %s ", newCStr); 
    NSLog(@"--------Encrypt--------"); 
    NSLog(@"encrypted str : %@", tempStr); 
    NSLog(@"temp data bytes : %s", dataCStr); 
    NSLog(@"data to str  : %@", dataToStr); 
    NSLog(@"base64 data  : %@", base64Str); 
    NSLog(@"data temp  : %@", tempData); 

    /** decrypt**/ 
    NSData *dataFrom64 = [NSData dataFromBase64String:base64Str]; 
    NSString *strFromData = [[NSString alloc] initWithData:dataFrom64 
              encoding:NSUTF8StringEncoding]; 
    char const *cStrFromData = [strFromData UTF8String]; 
    char *newStr2 = (char*)calloc(sizeof(char), strlen(cStrFromData)); 

    strcpy(newStr2, cStrFromData); 

    for (int i = 0, j = 0; i < lenStr; i++, j++) { 
     if (j >= lenKey) j = 0; 
     newStr2[i] = cStrFromData[i]^testCStr[j]; 
    } 

    NSLog(@"--------Decrypt--------"); 
    NSLog(@"data 64   : %@", dataFrom64); 
    NSLog(@"data 64 bytes : %s", [dataFrom64 bytes]); 
    NSLog(@"str from data : %@", strFromData); 
    NSLog(@"cStr from data : %s", [strFromData UTF8String]); 
    NSLog(@"decrypt utf8 : %s", newStr2); 
    NSLog(@"decrypt str  : %@", [NSString stringWithUTF8String:newStr2]); 

는 밖으로 넣어입니다 :

--------Test begins-------- 
    chinese   : abcd 測試 
    chinese utf8 : abcd 測試 
    encrypted utf8 : #!B5aºÄõ–ôá 
    --------Encrypt-------- 
    encrypted str : #!B5aºÄõ–ôá 
    temp data bytes : #!B5aºÄõ–ôá6.889 WebSocke 
    data to str  : #!B5aºÄõ–ôá 
    base64 data  : IyFCNWHCusOEw7XigJPDtMOh 
    data temp  : <23214235 61c2bac3 84c3b5e2 8093c3b4 c3a1> 
    --------Decrypt-------- 
    data 64   : <23214235 61c2bac3 84c3b5e2 8093c3b4 c3a1> 
    data 64 bytes : #!B5aºÄõ–ôá 
    str from data : #!B5aºÄõ–ôá 
    cStr from data : #!B5aºÄõ–ôá 
    decrypt utf8 : abcd òÇÙºÛî‚Äì√¥√° 
    decrypt str  : (null) 
    --------test ends-------- 

답변

1

문제는 newCStr가 null로 종료되지 않는 것입니다, 또한 유효한 UTF-8 문자열을 나타내지 않습니다. 따라서이 변환은 실패하거나 잘못된 결과를 나타낼 수밖에 없습니다.

다음 코드는 불필요한 변환을 방지 :

NSLog(@"--------Test begins--------"); 
NSString *plainText = @"abcd 測試"; 
NSString *keyString = @"topsecret"; 

/** encrypt **/ 
NSMutableData *plainData = [[plainText dataUsingEncoding:NSUTF8StringEncoding] mutableCopy]; 
NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding]; 
uint8_t *plainBytes = [plainData mutableBytes]; 
const uint8_t *keyBytes = [keyData bytes]; 
for (int i = 0, j = 0; i < [plainData length]; i++, j++) { 
    if (j >= [keyData length]) j = 0; 
    plainBytes[i] ^= keyBytes[j]; 
} 
NSString *base64Str = [plainData base64EncodedString]; 

NSLog(@"chinese   : %@", plainText); 
NSLog(@"--------Encrypt--------"); 
NSLog(@"base64 data  : %@", base64Str); 

/** decrypt**/ 
NSData *dataFrom64 = [NSData dataFromBase64String:base64Str]; 

NSMutableData *decodeData = [dataFrom64 mutableCopy]; 
uint8_t *decodeBytes = [decodeData mutableBytes]; 
for (int i = 0, j = 0; i < [decodeData length]; i++, j++) { 
    if (j >= [keyData length]) j = 0; 
    decodeBytes[i] ^= keyBytes[j]; 
} 
NSString *decrypted = [[NSString alloc] initWithData:decodeData 
               encoding:NSUTF8StringEncoding]; 
NSLog(@"--------Decrypt--------"); 
NSLog(@"decrypt str  : %@", decrypted); 

출력 :

 
--------Test begins-------- 
chinese   : abcd 測試 
--------Encrypt-------- 
base64 data  : FQ0TF0WFysmc3ck= 
--------Decrypt-------- 
decrypt str  : abcd 測試 
+0

여러분의 도움에 감사드립니다! 이제 작동합니다. – JonatWang

관련 문제