2012-04-07 11 views
2

私は文字列"SOMETHING /\xff"を持っていて、0xffの16進表現をcharバッファに保存したいと思います。だから私はstrncpyスラッシュ(/)の後のすべてを私のバッファに入れよう(buffと呼ぶ)。C文字列に16進値を格納していますか?

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

+0

これははっきりしません。以前の質問に対する答えですでに説明したように、 '\ xff'は文字通り文字列に格納されていません。 1文字(その値は255)がその場所に格納されます。 –

+1

スラッシュは次の文字に影響しません。 _does_ gdbがバッファに何を表示していますか? –

+1

その段落に行くコードはありますか? – DavidO

答えて

3

あなたの問題は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} 

これは、arrchar[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} 

印刷コマンドを使用する。

-2

Cの文字列はcharの値の配列であることに注意してください。 charは符号なし8ビット数です。 (intが符号付き16ビット数であるように)符号なし8ビットフィールドに配置できる最大値は0xFF 16進数または0377 8進数または11111111バイナリの255小数です。

Cの引用文字列の中で、\xNNという表記は、16進値がNNの文字を挿入することを意味します。

+1

-1;標準では、 'char'は符号なしであり、標準では8ビットでなければならず、' int'は16ビットでなければならないとは言いません。実際、最近のほとんどのコンパイラでは、 'int'は32ビットです。 –

0

0xFFは印刷可能なASCII文字ではないため、gdbは印刷できません。

関連する問題