私は文字列"SOMETHING /\xff"
を持っていて、0xff
の16進表現をchar
バッファに保存したいと思います。だから私はstrncpy
スラッシュ(/
)の後のすべてを私のバッファに入れよう(buff
と呼ぶ)。C文字列に16進値を格納していますか?
しかし、の内容を表示するには、print \x buff
のgdbコマンドを使用すると、0xff
は表示されません。何が間違っている可能性についての任意のアイデア?私のスラッシュが物事を乱す可能性はありますか?
私は文字列"SOMETHING /\xff"
を持っていて、0xff
の16進表現をchar
バッファに保存したいと思います。だから私はstrncpy
スラッシュ(/
)の後のすべてを私のバッファに入れよう(buff
と呼ぶ)。C文字列に16進値を格納していますか?
しかし、の内容を表示するには、print \x buff
のgdbコマンドを使用すると、0xff
は表示されません。何が間違っている可能性についての任意のアイデア?私のスラッシュが物事を乱す可能性はありますか?
あなたの問題はgdbの変数を印刷する方法と関係があると思います。 (GCCを使用している場合-g
)をデバッグとしてコンパイルし、この単純なプログラムを取り、そして実行し、最初の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}
これは、arr
がchar[6]
であり、char*
ではないことをgdbが認識できるためです。今、あなたはアドレスがで指さからバイトの一定量を印刷できるようにしたい場合は
(gdb) p /x "str \xff"
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
:あなたは、テストのもののために有用であるコマンドp /x "str \xff"
、同じ結果を得ることができますポインタの代わりにプリント(p
)から(x
)を調べるメモリコマンドを使用:
(gdb) x/6bx ptr
0x4005f8 <__dso_handle+8>: 0x73 0x74 0x72 0x20 0xff 0x00
アドレスからヘクスに6つのバイトを印刷しますptr
によって指されます。あなたのbuff
変数でそれを試してみて、行き先を見てください。
また、あなたが試すことができます別のものです:これはchar
は6つのchar
の配列の最初の要素としてptr
で指さ扱います、そしてあなたをできるようになります
(gdb) p /x (char[6])*ptr
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
印刷コマンドを使用する。
Cの文字列はchar
の値の配列であることに注意してください。 char
は符号なし8ビット数です。 (int
が符号付き16ビット数であるように)符号なし8ビットフィールドに配置できる最大値は0xFF 16進数または0377 8進数または11111111バイナリの255小数です。
Cの引用文字列の中で、\xNN
という表記は、16進値がNNの文字を挿入することを意味します。
-1;標準では、 'char'は符号なしであり、標準では8ビットでなければならず、' int'は16ビットでなければならないとは言いません。実際、最近のほとんどのコンパイラでは、 'int'は32ビットです。 –
0xFFは印刷可能なASCII文字ではないため、gdbは印刷できません。
これははっきりしません。以前の質問に対する答えですでに説明したように、 '\ xff'は文字通り文字列に格納されていません。 1文字(その値は255)がその場所に格納されます。 –
スラッシュは次の文字に影響しません。 _does_ gdbがバッファに何を表示していますか? –
その段落に行くコードはありますか? – DavidO