2

文字列があり、16 進表現をバッファー"SOMETHING /\xff"に保存したいと考えています。したがって、スラッシュ ( ) の後のすべてをバッファーに入れます (それを と呼びましょう)。0xffcharstrncpy/buff

しかし、gdb コマンドを使用しprint \x buffて の内容を表示するとbuff、 が表示されません0xff。何が間違っている可能性があるかについてのアイデアはありますか? 私のスラッシュが物事を台無しにしている可能性はありますか?

4

3 に答える 3

5

あなたの問題は、変数をgdbに出力する方法に関係していると思います。この単純なプログラムを取得し、デバッグとしてコンパイルし ( -ggcc を使用している場合)、実行して最初のputsステートメントでブレークします。

int main(void)
{
   char *ptr = "str \xff";
   char arr[] = "str \xff";
   puts(ptr);
   puts(arr);

   return 0;
}

ptrあなたが言及した方法で印刷しようとすると、 (それが指しているアドレス)のp /x ptr値が印刷されます:ptr

(gdb) p /x ptr
$1 = 0x4005f8

ただし、 に対して同じコマンドを実行するとarr、次のようになります。

(gdb) p /x arr
$2 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}

これは、 gdb がそれarrがタイプchar[6]であり、 ではないことを確認できるためchar*です。コマンドを使用して同じ結果を得ることができますp /x "str \xff"。これは、テストに役立ちます。

(gdb) p /x "str \xff"
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}


ポインターが指すアドレスから一定量のバイトを出力できるようにしたい場合は、print ( )xの代わりに inspect ( ) メモリ コマンドを使用します。p

(gdb) x/6bx ptr
0x4005f8 <__dso_handle+8>:  0x73    0x74    0x72    0x20    0xff    0x00

が指すアドレスから 6 バイトを 16 進数で出力しますptr。変数でそれを試して、buffどうなるか見てみましょう。


別の方法として、次のことを試すことができます。

(gdb) p /x (char[6])*ptr
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}

charこれにより、指されたptrが 6 の配列の最初の要素として扱われchar、print コマンドを使用できるようになります。

于 2012-04-07T22:54:56.687 に答える
-2

C の文字列はchar値の配列であることに注意してください。acharは符号なし 8 ビット量です。(ちょうどint符号付き 16 ビット量です。) 符号なし 8 ビット フィールドに配置できる最大値は、10 進数で 255、つまり 16 進数で 0xFF、8 進数で 0377、2 進数で 11111111 です。

C の引用符付き文字列内で、\xNN16 進値が NN である文字を挿入することを意味します。

于 2012-04-07T22:32:58.363 に答える