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.