2010-07-28 70 views
6

我有這樣的(不正確的)示例代碼,用於從stringstream中獲取值並將其存儲在字節大小的變量中(它需要位於單個字節的var中,而不是int) :使用stringstream獲取字節值

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    stringstream ss("1"); 

    unsigned char c; 
    ss >> c; 

    cout << (int) c << endl; 
} 

當我運行這個的輸出是49,這不是我想看到的。顯然,這被視爲一個字符而不是簡單的數字值。什麼是最C++ ish的方式讓c保持一個1而不是49時轉換爲int?

謝謝!

+0

嘗試字符串: 「\ 01」。或者設置一個char數組並初始化爲{1,0} – 2010-07-28 20:19:42

回答

10

最C++ - 雜交的方式當然是解析值正確讀取到另一個整體式,並然後強制轉換爲字節型(因爲讀成char永遠不會解析 - 它會永遠只是讀取的下一個字符):

typedef unsigned char byte_t; 

unsigned int value; 
ss >> value; 
if (value > numeric_limits<byte_t>::max()) { 
    // Error … 
} 

byte_t b = static_cast<byte_t>(value); 

我用unsigned int,因爲這是最自然的,雖然unsigned short當然會也行。

+0

感謝您的回覆。我希望有一些格式標誌,但一個演員也可以。 – twk 2010-07-28 19:49:35

2

減去'0'從它:

cout << (int) (c - '0') << endl; 

'0'具有48的值,因此,因此49 - 48 = 1

+0

不幸的是,我需要存儲在實際變量中的正確值。 – twk 2010-07-28 19:32:33

3

一個char將總是這樣。你需要讀取一個int(或float或double等),否則會調用錯誤的'formatter'。

unsigned char c; 
unsigned int i; 
ss >> i; 
c = i; 
+0

然後,讀完int後,將它複製到char! – Gianni 2010-07-28 19:34:46

0
stringstream ss("1"); 
unsigned char c; 
{ 
    unsigned int i; 
    ss >> i; 
    c = i; 
} 
cout << static_cast<int>(c) << endl; 

將工作。你也可以做一些不安全的指針,但是我會隨着上述去做。

-1

這是因爲C++中的字符串常量被視爲文本。
兩個選項:使用

  • 編碼字符串轉義數字:

    • 八進制數:\ 0 <d> {1,3}
    • 十六進制數:\ 0X <d> { 2}

    std :: stringstream(「\ 01 \ 02 \ 03 \ 04 \ 0xFF」);

  • 或構建字符數組和初始化它使用數字:

    char數據[] = {0,1,2,3,4,255};

如何:

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    char x[] = {1,0}; 
    stringstream ss(x); 

    unsigned char c; 
    ss >> c; 

    cout << (int) c << endl; 
}