2016-12-28 5 views
1

내가 이해하지 못하는 문제가 있습니다. 그것을 설명하기 전에, 올해 Objective-C를 사용하는 Swift 프로젝트를 작업 했더라도이 언어와 개념에 익숙하지 않습니다.NSData 바이트 액세스 - 디버거에서 같은 값이 아님

내 문제가 있습니다. NSData 개체의 바이트에 액세스하려고합니다. 나는 그렇게 할이 여러 가지 방법을 알고 :

[data bytes]; 

data.bytes; 

[data getBytes: dest, length: [data length]]; 

을하지만 po [data bytes]을 사용하고 때 각각의 방법은 콘솔과 동일한 값을 반환하지 않습니다.

왜 이렇게되는지 설명해 주시겠습니까? 나는 실종 된 것을 정말로 이해하지 못합니다.

감사합니다.

답변

2

datadata.bytes은 완전히 다른 두 가지 유형입니다. dataNSData의 인스턴스이고 data.bytes은 원시 포인터 (const void *)입니다. 디버거에서 po ("인쇄 개체"의 줄임말)을 호출하면 NSObject에서 상속받은 내용에 -description을 호출하거나 그렇지 않은 경우 값을 인쇄합니다. 당신 po data, 그것은 [data description]를 호출하고 그 밖의 결과를 출력하는 경우 data 이후이 경우

은 ( -description이있는)을 NSData이다; NSData은 내용을 멋지게 포맷하는 방법을 알고 있기 때문에 인쇄가 잘됩니다. data.bytesvoid * 때문에

그러나, 그것을 인쇄하는 방법을 알 수있는 디버거 방법이 없습니다 (무엇을 가리킬 수 있습니다 void *는, 그것은 전적으로 당신에게 달려 해석하는 방법) 그래서 그냥 포인터 자체를 출력 .

디버거에서 직접 데이터를 인쇄하려면 포인터를 해석하고 인쇄하는 방법을 알려줄 수 있습니다. 당신이 데이터 덩어리가 n 바이트는 것을 알고 있다면, 다음과 같은 명령을 실행할 수 있습니다 : <n>가 데이터 (예를 들어, uint8_t (*)[8]))의 문자 길이로 대체

p/x *(uint8_t (*)[<n>])data.bytes 

. *(uint8_t (*)[<n>])data.bytesdata.bytesn 바이트 (메모리에서 얼마나 많은 데이터를 읽을 지 알 수 있도록 길이를 제공)의 배열로 다시 해석하도록 디버거에 지시하고 p/x은 찾은 바이트의 16 진 값을 인쇄하도록 지시합니다.

+1

답장을 보내 주셔서 감사합니다. 지금은 꽤 분명합니다. 하지만 콘솔에서'po [data bytes]'명령을 사용하면 0x14ee2ee8과 같은 내용이 출력됩니다. 그리고 'po bytes' 명령을 사용할 때, bytes는 [data bytes]의 결과이고, "3w \ x80 \ x88 \ x17"과 같은 것을 출력합니다. 정확히'po [data bytes]'에 의해 반환되는 값은 무엇입니까? –

+1

'[data bytes]'변수를'bytes' 변수에 저장하면'bytes'의 타입은 무엇입니까? 당신의 선언은 어떻게 생겼습니까? –

+1

'bytes'는'const char *'입니다. –