我目前正在設計一個代碼,並且給出的指令之一是獲取十六進制字符串的前兩位數字並執行所需的操作。所有小於A的都被考慮在內。任何比這更大的東西都不是,它只需要下一個數字。這弄亂了代碼。將十六進制字符串轉換爲unsigned int問題C++
這裏是一個將其轉換線:
int x = atoi(hex.c_str);
我在做什麼錯?
我目前正在設計一個代碼,並且給出的指令之一是獲取十六進制字符串的前兩位數字並執行所需的操作。所有小於A的都被考慮在內。任何比這更大的東西都不是,它只需要下一個數字。這弄亂了代碼。將十六進制字符串轉換爲unsigned int問題C++
這裏是一個將其轉換線:
int x = atoi(hex.c_str);
我在做什麼錯?
我假設這是你的意思 - 你只想將字符串的前兩個十六進制數字轉換爲無符號整數。我還假定該字符串只包含有效的十六進制數字。如果你想驗證字符串,你需要爲它寫一些額外的代碼。
使用strtoul
改爲將十六進制字符串轉換爲無符號整數。還可以使用字符串類的substr()
方法僅提取十六進制字符串的前2位數字。
#include <string>
#include <cstdio>
#include <cstdlib>
int main()
{
std::string myhex = "abcdef";
unsigned int x = strtoul(myhex.substr(0, 2).c_str(), NULL, 16);
printf("x = %d\n", x);
}
這將是你的輸出(即0xab = 171
):
x = 171
int x = strtol(hex.c_str(), NULL, 16);
如果您想要讀取部分字符串,也可以使用sscanf
。你提到過你可能只想要前兩個字符:
int x;
if(1 == sscanf(hex.c_str(), "%2x", &x)) {
printf("Value is: %d\n", x);
} else {
printf("Conversion failed\n");
}
注意上面不是真的C++。您可以使用std::hex
流修改爲(注意,我叫你的字符串mystr
這段時間,以避免混淆(特別是如果你已經導入了命名空間std
):
int x;
std::istringstream iss(mystr);
bool ok = (iss >> std::hex >> x);
[編輯]我注意到您的評論你問轉換爲無符號整數,在這種情況下,爲什麼你沒有明確聲明你的整數作爲unsigned int
?
對於未簽名的,你應該使用strtoul
。
哇!我不知道Altavista仍然存在! – 2013-03-01 01:29:59
雖然2013年7月8日停止存在。它只是重定向到Yahoo! – nikoliazekter 2017-01-20 18:05:48
如果你要轉換爲無符號的,你可能想要使用strtoul
- 前綴爲0x
或給予16的基數。有可能strtol
也可以正常工作,但這應該會給出一個有符號的值,所以至少你可能會得到一些警告信息,讓你從某些編譯器中混合簽名和未簽名。
您使用的atoi。 (閱讀規格。) – 2013-03-01 00:46:37
(試試strtol與基地16) – 2013-03-01 00:48:44
好的,是否有另一條指令,我們可以用來將十六進制字符串轉換爲無符號整型? – 2013-03-01 00:48:50