2015-07-09 202 views
2

我試圖將字符串轉換爲IP地址。輸入字符串是一個轉換爲std::string的無符號整數,例如"123456"。 下面的代碼不正確,因爲它會產生不可讀的二進制字符。將字符串轉換爲IP地址時輸出錯誤

std::string str2IP(const std::string& address) 
{ 
    uint32_t ip = std::strtoul(address.c_str(), NULL, 0); 
    unsigned char bytes[4]; 
    bytes[0] = ip & 0xFF; 
    bytes[1] = (ip >> 8) & 0xFF; 
    bytes[2] = (ip >> 16) & 0xFF; 
    bytes[3] = (ip >> 24) & 0xFF; 

    std::stringstream ss; 
    ss << bytes[3] << "." << bytes[2] << "." << bytes[1] << "." << bytes[0]; 
    return ss.str(); 
} 
+2

您輸入了什麼輸出?你對這個輸入有什麼期望的輸出? (另外,你爲什麼要輸出字符?) –

回答

1

1.4.3 char s到一個std::stringstream具有輸出由char而非數值表示所表示的編碼的字符的語義。

可以通過使用一元加號促進這些char s強制數值表示:

ss << +bytes[3] << "." << +bytes[2] << "." << +bytes[1] << "." << +bytes[0]; 
+1

這將工作。但這對於可讀性好的可移植/可維護代碼來說並不是一個好主意。改變'bytes'的類型或者明確地強制轉換它們(static_cast)以使它明顯地表明你在做什麼。 –

3

格式化的輸出功能(操作者<<)I/O流治療charsigned char,和unsigned char字符的—他們將該值解釋爲字符代碼,而不是數字。這段代碼將輸出A

unsigned char c = 65; 
std::cout << c; 

這同樣適用於std::uint8_t上大多數實現的,因爲他們只是把它作爲一個typedefunsigned char。您需要使用適當的數字類型,例如unsigned short

std::string str2IP(const std::string& address) 
{ 
    uint32_t ip = std::strtoul(address.c_str(), NULL, 0); 
    unsigned short bytes[4]; 
    bytes[0] = ip & 0xFF; 
    bytes[1] = (ip >> 8) & 0xFF; 
    bytes[2] = (ip >> 16) & 0xFF; 
    bytes[3] = (ip >> 24) & 0xFF; 

    std::stringstream ss; 
    ss << bytes[3] << "." << bytes[2] << "." << bytes[1] << "." << bytes[0]; 
    return ss.str(); 
} 
相關問題