2011-05-23 18 views
2

如何將二進制/十六進制字符串轉換爲整數,因爲我不知道字符串有多大?模板整數的未知比特大小

我想要什麼atoi/atol這樣做,但我不知道輸出什麼,因爲我不知道值是32位還是64位。此外,atoi不會做十六進制,因此101將變爲101而不是0x101==257

我假設我需要使用template<typename T>,但是我將如何創建變量以在函數中輸出? T varname可能是任何東西,所以varname是什麼數字而不是一個指向某個隨機位置的指針?

+0

你有什麼類型的記保持一個大於64位的整數? – hirschhornsalz 2011-05-23 22:04:25

+0

還不知道。我現在應該刪除該部分 – calccrypto 2011-05-23 22:05:55

+1

WTH隨機downvote。這讓我非常惱火,當它不是我的問題時,它讓我困擾。問題對我來說是完全意義上的。 – 2011-05-23 22:13:46

回答

3

模板是一個編譯時間的事情。您不能在運行時選擇數據類型。如果您的輸入值不會超過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" 
+0

即時通訊即時做,但我將如何做二進制字符串? std :: bin不存在 – calccrypto 2011-05-23 22:15:05

+0

我認爲他的意思是製作一個模板,這樣他就不必爲每種類型的數值變量重寫代碼。 – 2011-05-23 22:15:34

+0

是的。我不想用所有不同類型的整數重載相同的函數 – calccrypto 2011-05-23 22:16:18

0

也許像未經測試的:

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; 
}