2

私はCの中間知識がなくてもC#からObjective-Cに来ています(はい、はい、いつかCを学ぶ必要があり、完全に学ぶつもりです)。Appleの証明書、キー、および信頼サービスプログラミングガイドには、次のコードです:

static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";

私はNSStringここで識別子として使用したいものを持っていますが、私の人生の間、それをこのデータ構造に組み込む方法を理解することはできません。グーグルでの検索も無駄でした。NSStringクラスリファレンスとメソッドを確認しましたUTF8StringgetCharacters、製品を構造体に組み込むことができませんでした。

私が見逃しているシンプルで簡単なトリックは何ですか?

4

4 に答える 4

7

それらはC文字列です:文字の配列(NSArrayではなくC配列)。最後の文字はNULで、数値は0です。

「UInt8」は、符号なしオクテットのCoreServices名であり、(Mac OS Xでは)符号なし文字と同じです。

static配列がこのファイルに固有であるか(ファイルスコープ内にある場合)、または関数呼び出し間で持続することを意味します(メソッドまたは関数本体内にある場合)。

constあなたが推測することを意味します:これらの配列の文字を変更することはできません。

\0はNULですが、これらの例に示されているようにリテラルに明示的に含めること""は冗長です。""リテラル()なしはとにかく@NULで終了します。

Cはエンコーディングを指定しません。Mac OS Xでは、一般的にASCII互換であり、通常はUTF-8です。

NSStringをC文字列に変換するには、UTF8Stringまたはを使用しますcStringUsingEncoding:。NSStringにC文字列をバッファに抽出させるには、を使用しますgetCString:maxLength:encoding:

于 2009-06-30T23:41:20.447 に答える
3

ここでポイントを逃している人もいると思います。タグ用に設定されている2つの定数配列については誰もが説明していますが、を使用する場合はNSString、そのまま属性ディクショナリに追加するだけです。何かに変換する必要はありません。例えば:

NSString *publicTag = @"com.apple.sample.publickey";
NSString *privateTag = @"com.apple.sample.privatekey";

例の残りの部分はまったく同じです。この場合、C文字列リテラルはまったく必要ありません。

于 2009-06-30T23:55:34.100 に答える
3

char*NSStringから(C文字列)を取得するのは難しい部分ではありません。(ところで、UTF8Stringもお勧めします。もっと簡単です。)Appleが提供するコードは、配列変数にC文字列リテラルを割り当てているため機能します。static const関数またはメソッド呼び出しの結果をに割り当てることconstはおそらく機能しません。

私は最近、Objective-Cで定数を定義することについてのSOの質問に答えました。これは、あなたの状況に役立つはずです。const修飾子を取り除くことによって妥協する必要があるかもしれません。宣言されているstatic場合は、少なくとも、宣言されているコンパイルユニットの外部では誰も参照できないことを知っているので、他のコードがポインタなどを介して変更できるように、参照を「エスケープ」させないようにしてください。

ただし、@ Jasonが指摘しているように、char*に変換する必要はまったくないかもしれません。サンプルコードは、これらの文字列ごとにNSDataオブジェクトを作成します。コード内で次のようなことを行うことができます(ステップ1と3を置き換えます)。

NSData* publicTag  = [@"com.apple.sample.publickey"  dataUsingEncoding:NSUnicodeStringEncoding];
NSData* privateTag = [@"com.apple.sample.privatekey" dataUsingEncoding:NSUnicodeStringEncoding];

すでにNSStringがある場合は、C配列を扱うよりも確かに簡単に思えます。

于 2009-06-30T21:40:03.953 に答える
2

これを試して

NSString * newString =@"これはテスト文字列です。";
char * theString;

theString = [newString cStringWithEncoding:[NSString defaultCStringEncoding]];

于 2009-06-30T20:33:19.250 に答える