web-dev-qa-db-ja.com

Objective-C整数を16進値に変換する

私はそのように初期化された辞書を持っています...

keyDictionary = [[NSDictionary dictionaryWithObjects:values forKeys:keys]retain];

ここで、keysはアルファベットおよびその他の文字のNSArrayであり、valuesunsigned charsのNSArrayであり、これはUSBの16進キーコードです。それらの文字。

USBキーコードは、0x04から0xE7の範囲の16進値です。キーボードで押されたキーに応じて、これら2つの間のマップを作成しようとしています。

values配列は次のように作成されます...

NSArray *values = [NSArray arrayWithObjects: 
                  [NSNumber numberWithUnsignedChar:0x04]/*A*/,
                  [NSNumber numberWithUnsignedChar:0x05]/*B*/, /*ETC*/]; 

したがって、理想的には、このコードを実行すると... where character == @"I"

- (uint8) getUSBCode:(NSString *)character
{
    NSNumber *val = [keyDictionary objectForKey:character];

    return (uint8)[val unsignedCharValue];
}

0x0Cを取り戻すことを期待していますが、intとして12を取り戻しています(これについて考えた後、理にかなっています)。 16進値を保持する必要があります。文字列値は必要ありません。 16進値への直接変換またはより良い保存方法が必要です

uint8は単なるtypedefunsignedcharです。

[〜#〜] edit [〜#〜]以前にこれを投稿したときははっきりしませんでした。これが私が必要なものです。

これらのコードは社内ネットワークを介して送信されているため、16進値が必要です。さらに、押されたキーの値は、ビッグエンディアン(または少し、今はどちらであるかをエスケープしている)から別の値に変換され、内部ネットワークを介して送信されます。これらの値がバイナリで格納されていることは理解していますが、16進数で送信する必要があります。

また、関数から12を取り戻していると述べました。デバッガーから12を読み取っていましたが、実際には値を取得していませんでした。それが私が混乱していた理由かもしれません。

14
DavidAndroidDev

12(基数10)is 0x0c。

16進数で印刷する場合は、%x形式指定子を使用します。

NSLog(@"Hex value of char is 0x%02x", (unsigned int) c);

デバッガーで16進数で表示する場合(Xcode 3.2.xを想定)、変数を右クリックし、形式として16進数を選択します。

49
JeremyP

Intはバイナリで格納されることを知っているので(つまり、「hex」値は常に保持され、決して保持されません)、私はあなたの質問を画面への印刷に関するものとして解釈しています。
そのために フォーマット指定子 を使用できるはずです-%0xのようなもの。

0
Richard

-getUSBCode:メソッドから返される値は、10進数の2桁ではなく、1つの8ビットバイトです。 「12」および「0x0C」は両方ともそのバイトの値を表す文字列であるため、「0x0C」が必要であるが文字列は必要ないと言うことは矛盾しています。

0
Sherm Pendley