2012-04-07 101 views
2

我有一個字符串"SOMETHING /\xff",我想將0xff的十六進制表示保存到一個char緩衝區中。所以我strncpy正斜槓(/)後的所有內容放入我的緩衝區(我們稱之爲buff)。在C字符串中存儲十六進制值?

但是,當我使用gdb命令print \x buff來查看buff的內容時,它不顯示0xff。任何想法可能是錯誤的?我的前鋒可能會搞砸了嗎?

+0

這還不清楚。正如你在前面的問題的答案中已經解釋的那樣,'\ xff'並不是真正存儲在字符串中的。單個字符(其值爲255)存儲在其位置。 – 2012-04-07 22:24:53

+1

正斜槓不應該影響以下字符。什麼_does_ gdb在緩衝區中顯示? – 2012-04-07 22:25:17

+1

你有任何代碼去與該段? – DavidO 2012-04-07 22:25:32

回答

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} 

這是因爲gdb可以看到arrchar[6]而不是char*。你可以用命令p /x "str \xff",這對於測試的東西是很有用的相同的結果:

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


現在,如果你想成爲能夠打印一定量的字節從地址的指向一個指針,使用檢查(x)存儲器命令而不是打印(p)的:

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

那將在十六進制打印6個字節的地址所指向的ptr。試着用你的buff變量來看看你是如何去的。


或者,你可以嘗試其他的事情是:

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

這將把char指向ptr如在6 char秒的數組的第一個元素,並允許你使用打印命令。

-2

請記住,C中的字符串是一個char值的數組。而char是一個無符號的8位數量。 (就像int是一個帶符號的16位數量一樣。)可以放在無符號8位字段中的最大值是255十進制,它是0xFF十六進制或0377八進制或11111111二進制。

在C中帶引號的字符串中,符號\xNN表示插入十六進制值爲NN的字符。

+1

-1;標準中沒有任何內容說'char'是無符號的,標準中沒有任何內容說它必須是8位,或者'int'必須是16位。實際上,在大多數編譯器中,「int」是32位。 – 2014-06-29 21:12:14

0

0xFF不是可打印的ASCII字符,所以gdb無法打印它。