2016-12-28 23 views
1

私は理解できない問題に直面しています。それを説明し始める前に、今年Objective-Cを使っていたSwiftプロジェクトに取り組んできたとしても、私はこの言語とその概念に慣れていません。NSDataバイトへのアクセス - デバッガと同じ値ではありません

私の問題です。NSDataオブジェクトのバイトにアクセスしたいのです。私はそうするが、いくつかの方法を知っている:

[data bytes]; 

data.bytes; 

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

をしかし、私はpo [data bytes]を使用していたときに、それぞれの方法は、コンソールと同じ値を返しません。

なぜこれが起こるのか説明できますか?私は何が欠けているのか分かりません。

ありがとうございました。

答えて

2

dataおよびdata.bytesは、全く異なる2つのタイプのものです。 dataNSDataのインスタンスであり、data.bytesは生ポインタ(const void *)です。デバッガでpo( "print object"の略)を呼び出すと、NSObjectから継承したものに対して-descriptionが呼び出されます。そうでない場合は値を出力します。 dataは(-descriptionを有する)NSDataあるのであなたpo dataこの場合

は、それは[data description]を呼び出し、その結果をプリントアウトします。 NSDataは内容をうまくフォーマットする方法を知っているので、うまく印刷できます。

data.bytesvoid *あるので、それを印刷する方法を知ってデバッガのための方法はありません(void *が何を指すことができますが、それは完全にあなた次第ですどのように解釈する)ので、それだけでポインタ自体を出力します。

デバッガから直接データを印刷したい場合は、ポインタを解釈して印刷する方法を教えてください。 <n>はデータのリテラル長(例えばuint8_t (*)[8]))に置き換えられ

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

:あなたはデータブロブがnバイト長であることがわかっている場合は、次のコマンドを実行することができます。 *(uint8_t (*)[<n>])data.bytesは、data.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 * 'です。 –

関連する問題