如何將二進制/十六進制字符串轉換爲整數,因爲我不知道字符串有多大?模板整數的未知比特大小
我想要什麼atoi
/atol
這樣做,但我不知道輸出什麼,因爲我不知道值是32位還是64位。此外,atoi
不會做十六進制,因此101
將變爲101
而不是0x101==257
。
我假設我需要使用template<typename T>
,但是我將如何創建變量以在函數中輸出? T varname
可能是任何東西,所以varname
是什麼數字而不是一個指向某個隨機位置的指針?
如何將二進制/十六進制字符串轉換爲整數,因爲我不知道字符串有多大?模板整數的未知比特大小
我想要什麼atoi
/atol
這樣做,但我不知道輸出什麼,因爲我不知道值是32位還是64位。此外,atoi
不會做十六進制,因此101
將變爲101
而不是0x101==257
。
我假設我需要使用template<typename T>
,但是我將如何創建變量以在函數中輸出? T varname
可能是任何東西,所以varname
是什麼數字而不是一個指向某個隨機位置的指針?
你只需要定義一個bigInt類,然後將你的字符串解析到該類中;像這樣的類:https://mattmccutchen.net/bigint/
模板是一個編譯時間的事情。您不能在運行時選擇數據類型。如果您的輸入值不會超過64位類型的範圍,則只需使用64位類型。
的一種方式(但絕不是唯一的方法)來進行轉換如下:
template <typename T>
T hex_to_int(const std::string &str)
{
T x;
std::stringstream(str) >> std::hex >> x;
return x;
}
std::string str = "DEADBEEF"; // hex string
uint64_t x = hex_to_int<uint64_t>(str);
std::cout << x << std::endl; // "3735928559"
即時通訊即時做,但我將如何做二進制字符串? std :: bin不存在 – calccrypto 2011-05-23 22:15:05
我認爲他的意思是製作一個模板,這樣他就不必爲每種類型的數值變量重寫代碼。 – 2011-05-23 22:15:34
是的。我不想用所有不同類型的整數重載相同的函數 – calccrypto 2011-05-23 22:16:18
也許像未經測試的:
int // or int64 or whatever you decide on
hexstr2bin (char *s) { // *s must be upper case
int result = 0; // same type as the type of the function
while (*char) {
result <<= 16;
if (*char) <= '9' {
result += *char & 0xF;
}
else {
result = (*char & 0xF) + 9;
}
}
return result;
}
你有什麼類型的記保持一個大於64位的整數? – hirschhornsalz 2011-05-23 22:04:25
還不知道。我現在應該刪除該部分 – calccrypto 2011-05-23 22:05:55
WTH隨機downvote。這讓我非常惱火,當它不是我的問題時,它讓我困擾。問題對我來說是完全意義上的。 – 2011-05-23 22:13:46