我是C++的初級用戶,我想知道如何執行此操作: 如何從字符串/ int中創建字節。因此,例如我有:C++中的字符串/ int的字節
string some_byte = "202";
當我將這個字節保存到一個文件,我想該文件是1個字節,而不是3個字節。 這怎麼可能? 由於提前, 添
我是C++的初級用戶,我想知道如何執行此操作: 如何從字符串/ int中創建字節。因此,例如我有:C++中的字符串/ int的字節
string some_byte = "202";
當我將這個字節保存到一個文件,我想該文件是1個字節,而不是3個字節。 這怎麼可能? 由於提前, 添
我會使用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.
但是,從流中讀取'unsigned char'將只讀取一個字節,並將其直接存儲。你必須讀一個'int'以使'istream'理解爲一個數字。 – 2010-06-01 16:36:22
謝謝。編輯。 – Alan 2010-06-01 16:41:44
使用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錯誤。
'sizeof(int)'通常不是'1'。 – 2010-06-01 16:25:31
將整數轉換爲'cout'會將其轉換回十進制字符串。 – 2010-06-01 16:27:18
我會將類型從int更改爲無符號字符,以防止任何大於255的值。 – Alan 2010-06-01 16:28:10
在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));
簡單的答案是...
int value = atoi(some_byte) ;
還有一些其他的問題,雖然。
1)什麼大小是一個整數,它是重要的? (幾乎所有的系統,這將是一個多字節)
int size = sizeof(int) ;
2)爲Endianness重要? (如果是查看htons()/ ntohs()函數)
顯示編寫代碼,因爲存在bug – Svisstack 2010-06-01 16:20:24
所以你是C++的新手,所以這裏有幾個指針:1)編寫C++代碼或C代碼。不要混合搭配。 2)http://www.parashift.com/c++-faq-lite/是學習如何編寫C++代碼的好地方。 – Alan 2010-06-01 16:35:05
通過混搭,我的意思是,不要混用和匹配C和C++習語。你可以從你的C++代碼中調用C代碼,並且同樣允許C代碼調用你的C++代碼。 – Alan 2010-06-01 16:49:18