我有一個字符串"SOMETHING /\xff"
,我想將0xff
的十六進制表示保存到一個char
緩衝區中。所以我strncpy
正斜槓(/
)後的所有內容放入我的緩衝區(我們稱之爲buff
)。在C字符串中存儲十六進制值?
但是,當我使用gdb命令print \x buff
來查看buff
的內容時,它不顯示0xff
。任何想法可能是錯誤的?我的前鋒可能會搞砸了嗎?
我有一個字符串"SOMETHING /\xff"
,我想將0xff
的十六進制表示保存到一個char
緩衝區中。所以我strncpy
正斜槓(/
)後的所有內容放入我的緩衝區(我們稱之爲buff
)。在C字符串中存儲十六進制值?
但是,當我使用gdb命令print \x buff
來查看buff
的內容時,它不顯示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}
這是因爲gdb可以看到arr
是char[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
秒的數組的第一個元素,並允許你使用打印命令。
請記住,C中的字符串是一個char
值的數組。而char
是一個無符號的8位數量。 (就像int
是一個帶符號的16位數量一樣。)可以放在無符號8位字段中的最大值是255十進制,它是0xFF十六進制或0377八進制或11111111二進制。
在C中帶引號的字符串中,符號\xNN
表示插入十六進制值爲NN的字符。
-1;標準中沒有任何內容說'char'是無符號的,標準中沒有任何內容說它必須是8位,或者'int'必須是16位。實際上,在大多數編譯器中,「int」是32位。 – 2014-06-29 21:12:14
0xFF不是可打印的ASCII字符,所以gdb無法打印它。
這還不清楚。正如你在前面的問題的答案中已經解釋的那樣,'\ xff'並不是真正存儲在字符串中的。單個字符(其值爲255)存儲在其位置。 – 2012-04-07 22:24:53
正斜槓不應該影響以下字符。什麼_does_ gdb在緩衝區中顯示? – 2012-04-07 22:25:17
你有任何代碼去與該段? – DavidO 2012-04-07 22:25:32