C++中的字符串/ int的字节
我是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