C++中的字符串/ int的字节

问题描述:

我是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

我会使用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

使用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

在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()函数)

+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