2010-06-01 44 views
1

我是C++的初級用戶,我想知道如何執行此操作: 如何從字符串/ int中創建字節。因此,例如我有:C++中的字符串/ int的字節

string some_byte = "202"; 

當我將這個字節保存到一個文件,我想該文件是1個字節,而不是3個字節。 這怎麼可能? 由於提前, 添

+0

顯示編寫代碼,因爲存在bug – Svisstack 2010-06-01 16:20:24

+1

所以你是C++的新手,所以這裏有幾個指針:1)編寫C++代碼或C代碼。不要混合搭配。 2)http://www.parashift.com/c++-faq-lite/是學習如何編寫C++代碼的好地方。 – Alan 2010-06-01 16:35:05

+0

通過混搭,我的意思是,不要混用和匹配C和C++習語。你可以從你的C++代碼中調用C代碼,並且同樣允許C代碼調用你的C++代碼。 – Alan 2010-06-01 16:49:18

回答

4

我會使用C++的字符串流類<sstream>將字符串轉換爲無符號字符。

並將無符號字符寫入二進制文件。

所以像[不是真正的代碼]

std::string some_byte = "202"; 
std::istringstream str(some_byte); 
int val; 
if(!(str >> val)) 
{ 
    // bad conversion 
} 

if(val > 255) 
{ 
    // too big 
} 

unsigned char ch = static_cast<unsigned char>(val); 

printByteToFile(ch); //print the byte to file. 
+0

但是,從流中讀取'unsigned char'將只讀取一個字節,並將其直接存儲。你必須讀一個'int'以使'istream'理解爲一個數字。 – 2010-06-01 16:36:22

+0

謝謝。編輯。 – Alan 2010-06-01 16:41:44

-1

使用boost :: lexical_cast的

#include "boost/lexical_cast.hpp" 
#include <iostream> 

int main(int, char**) 
{ 
    int a = boost::lexical_cast<int>("42"); 
    if(a < 256 && a > 0) 
     unsigned char c = static_cast<unsigned char>(a); 

} 

你會發現在http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm

文檔但是,如果我們的目標是節省空間的文件,我不不認爲這是正確的路要走。如果要將「257」轉換爲字節,程序的行爲如何? Juste是最簡單的。你會工作得出來以後的任何空間的使用顧慮,如果是相關的(經驗法則:總是用「詮釋」爲整數,而不是其他類型的,除非有比年初優化等非常具體的原因)

編輯 作爲評論說,它只適用於整數,切換到字節不會(它會拋出異常)。 那麼如果你試圖解析「267」會發生什麼?恕我直言,它應該通過一個int,然後做一些界限測試,然後只鑄入一個字符。例如,通過atoi會導致extreamly錯誤。

+0

'sizeof(int)'通常不是'1'。 – 2010-06-01 16:25:31

+0

將整數轉換爲'cout'會將其轉換回十進制字符串。 – 2010-06-01 16:27:18

+0

我會將類型從int更改爲無符號字符,以防止任何大於255的值。 – Alan 2010-06-01 16:28:10

2

在C++中,從字符串鑄造/最好做使用字符串流:

#include <sstream> 
// ... 
std::istringstream iss(some_string); 
unsigned int ui; 
iss >> ui; 
if(!iss) throw some_exception('"' + some_string + "\" isn't an integer!"); 
unsigned char byte = i; 

要寫入文件,可以使用文件流。但是,流通常將字符串寫入/讀取數據。你將不得不以二進制方式打開該文件,並寫入二進制,太:

#include <fstream> 
// ... 
std::ofstream ofs("test.bin", std::ios::binary); 
ofs.write(reinterpret_cast<const char*>(&byte), sizeof(byte)/sizeof(char)); 
2

簡單的答案是...

int value = atoi(some_byte) ; 

還有一些其他的問題,雖然。

1)什麼大小是一個整數,它是重要的? (幾乎所有的系統,這將是一個多字節)

int size = sizeof(int) ; 

2)爲Endianness重要? (如果是查看htons()/ ntohs()函數)

+0

如果我向'atoi()'提供無稽之談會發生什麼? -1 – sbi 2010-06-01 16:44:27

+0

哦,sizeof'的結果是'std :: size_t',而不是'int'。 – sbi 2010-06-01 16:44:49

+1

@sbi - 如果你在回答中提供廢話時會發生什麼?認真的人。 – 2010-06-01 16:56:30