2015-01-26 98 views
0
一個char *

我調用與920173e3作爲命令行參數下面的程序:將含有十六進制數字

void getAddr(void* addr) 
{ 
    unsigned const char* temp = (unsigned const char*)addr; 
    printf("%s", &temp[0]); 
} 

int main(int argc, char *argv[]) 
{ 
    getAddr(argv[1]); 
    return 0; 
} 

printf("%s", &temp[0])打印920173e3正確的,但我怎麼能然後打印920173e4920173e5等等?

如果我嘗試像printf("%s", &temp[1])temp++,然後printf("%s", &temp[0])只是切斷原始字符串的部分(920173e3變得20173e3,然後0173e3等)。

+1

所以,你只是想知道如何將字符串轉換爲十六進制?你的問題的其餘部分只是你爲什麼要這樣做的額外細節?如果是這樣,請看這裏http://stackoverflow.com/questions/10746450/how-to-convert-string-to-hexadecimal – John3136 2015-01-26 23:26:58

+0

不知道這是否與你的目標相關,但你應該記住,每一個進程擁有自己的專用虛擬內存。因此,使用輸入「930582ef」運行該程序不會讓您看到物理內存地址「930582ef」中的內容,而是您將在其虛擬地址空間中看到程序看到的「930582ef」,這可能是某些其他物理地址。如果地址超出程序的私有內存,則會出現分段錯誤。 – eigenchris 2015-01-26 23:32:46

+1

你問算法將十六進制轉換爲十進制嗎? – 2015-01-27 03:21:01

回答

2

您的代碼不起作用,因爲它使用字符串而不是數字。當您打印&temp[0]時,它與直接打印temp相同;當你「增加」它時,你會將指針遞增到字符串的開頭,這樣它會從前面刪除一個字符。

要真正增加它作爲一個數字,你需要將其轉換爲一個,並將其顯示爲一個:

void getAddr(unsigned long addr) 
{ 
    printf("%lx", addr); 
} 

int main(int argc, char *argv[]) { 
    getAddr(strtoul(argv[1], NULL, 16)); 
    return 0; 
} 

現在可以正確地增加它,等

+1

你可能知道這一點。但重要的是檢查'strtol'的返回值,因爲它可能會失敗。 – 2015-01-27 03:30:13

+1

@self:是的,我忽略了錯誤檢查,因爲它是一個玩具程序。雖然好點。 – 2015-01-27 03:31:20

+0

是的!正是我在找什麼。謝謝!現在我們使用long而不是char *,但是如何輸出該地址處的字節呢? – user3742048 2015-01-27 17:08:07

相關問題