NSData를 문자열로 변환 하시겠습니까?


122

openssl 개인 키 EVP_PKEY를 nsdata로 저장하고 있습니다. 이를 위해 아래 코드를 사용하여 바이트 스트림으로 직렬화하고 있습니다.

unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
p = buf;
i2d_PrivateKey(pkey, &p);

여기서 pkey는 EVP_PKEY 유형입니다. 그런 다음 아래 주어진 줄을 사용하여 버퍼 'p'의 바이트를 NSData로 저장합니다.

NSData *keydata = [NSData dataWithBytes:P length:len];

이제 아래에 주어진 코드를 사용하여 NSString으로 변환하고 있지만 콘솔에 인쇄하면 다른 문자가 제공됩니다.

NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];

누군가 도울 수 있습니까?

기본적으로 EVP_PKEY를 sqlite 데이터베이스에 저장하고 싶습니다.

나는 올바른 길을 가고 있는가? 감사.


"다른 캐릭터"라니 무슨 뜻이야? 거기에 있으면 안되는 추가 문자를 끝에 인쇄합니까, 아니면 예상과 완전히 다른 문자를 인쇄합니까?
Tom Harrington

그것과는 완전히 다릅니다
Zach

데이터가 실제로 UTF-8로 인코딩 된 것이 확실합니까? 나는 i2d_PrivateKey에 익숙하지 않지만 결과는 올바른 문자열 인코딩을 사용하고 있지 않음을 시사합니다.
Tom Harrington

@TOm : 감사합니다. ASCIIEncoding이었습니다. 이제 잘 작동합니다
Zach

아니요, 당신은 여기서 올바른 길을 가고 있지 않으며 모든 대답이 잘못된 것 같습니다. 데이터를 .NET Framework로 변환하려면 base64 인코딩을 사용해야 NSData합니다 NSString.
Maarten Bodewes 2013-08-06

답변:


260

목표 -C

사용할 수 있습니다 ( NSString 클래스 참조 참조 )

- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

예:

NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

비고 : NSData지정된 인코딩 (위의 예에서는 UTF-8)에 대해 값이 유효해야합니다. 그렇지 않으면 다음 nil이 반환됩니다.

어떤 이유로 초기화가 실패하면 (예 : 데이터가 인코딩에 유효한 데이터를 나타내지 않는 경우) nil을 반환합니다.

이전 Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0 이상

String(data: yourData, encoding: .utf8)

참조 문자열 # 초기화 (데이터 : 인코딩 :) 참조


답장을 보내 주셔서 감사합니다. 이미 시도했지만 성공하지 못했습니다.
Zach

26
디버거에서 :po [[NSString alloc] initWithData:myData encoding:4]
Berik

7
NSDataUTF-8 범위를 벗어난 것을 포함하여 모든 바이트 값을 포함 할 수 있지만이 답변은 어떻게 많은 upvotes를 가질 수 있습니까?
Maarten Bodewes 2013-08-06

2
여기에있는 사람들이 데이터 응답을 서버에서 문자열로 변환하기 때문입니다.
Necro

1
NSData가 <strong> 실제로 </ strong> UTF-8 범위를 벗어난 값을 포함하면 어떻게됩니까?
Zennichimaro

24

이전 Swift 3.0 :

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 4.0의 경우 :

String(data: yourData, encoding: .utf8)

3

나는 당신의 "P"를 dataWithBytes 매개 변수로 믿는다.

NSData *keydata = [NSData dataWithBytes:P length:len];

"buf"여야합니다.

NSData *keydata = [NSData dataWithBytes:buf length:len];

i2d_PrivateKey는 버퍼 끝에있는 출력 버퍼 p에 포인터를 놓고 추가 입력을 기다리고 있기 때문에 buf는 여전히 버퍼의 시작을 가리 킵니다.

다음 코드는 pkey가 EVP_PKEY에 대한 포인터 인 나를 위해 작동합니다.

unsigned char *buf, *pp;
int len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
pp = buf;
i2d_PrivateKey(pkey, &pp);

NSData* pkeyData = [NSData dataWithBytes:(const void *)buf length:len];
DLog(@"Private key in hex (%d): %@", len, pkeyData);

온라인 변환기를 사용하여 바이너리 데이터를 Base 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=en ) 로 변환 하고 다음 명령을 사용한 후 인증서 파일의 개인 키와 비교할 수 있습니다. mypkey.pem의 출력 확인 :

openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem

내 답변을 위해 귀하의 질문 과이 EVP 기능 사이트 를 참조했습니다 .



1

임의의 NSData를 NSString으로 변환하는 간단한 방법은 base64로 인코딩하는 것입니다.

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

그런 다음 나중에 다시 사용할 수 있도록 데이터베이스에 저장할 수 있습니다. NSData로 다시 디코딩하십시오.


1

스위프트 5 :

String(data: data!, encoding: String.Encoding.utf8)

이것은 나를 위해 더 나은 pierre23 답변의 수정 된 사본입니다. 일반적 으로이 페이지를 사용하여 코드를 복사하고 yourData를 데이터로 수정해야했습니다! 시간이 걸립니다. 이제 저와 당신은 수정없이 복사하고 붙여 넣습니다.
Alexander Volkov

이것은 Swift와 관련된 질문이 아닙니다. 또한 질문의 코드 샘플은 Objective-C 코드입니다. 그리고 마지막으로 코드에서 강제 풀림으로 인해 예기치 않은 충돌이 발생할 수 있습니다.
Cristik

@Cristik 질문은 Obj-C로 태그가 지정되지 않았습니다.
Eiko

@AlexanderVolkov 해당하는 엑스 코드 스 니펫 (snippet)을 추가 할 수 있습니다, 그것은 더 빨리 이보다 것)
Cristik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.