我是C ++的初级用户,我想知道如何做到这一点: 如何从字符串/ int'创建'一个字节。所以例如我:
string some_byte = "202";
当我将该字节保存到文件时,我希望该文件是1个字节而不是3个字节。 怎么可能? 提前致谢, 添
答案 0 :(得分:4)
我会使用C ++的String Stream类<sstream>
将字符串转换为unsigned char。
将unsigned char写入二进制文件。
所以像[不是真正的代码]
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.
答案 1 :(得分: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 :(得分:2)
简单的答案是......
int value = atoi( some_byte ) ;
但是还有其他一些问题。
1)int的大小是多少,重要吗? (对于几乎所有系统来说,它将超过一个字节)
int size = sizeof(int) ;
2)Endianness重要吗? (如果是查看htons()/ ntohs()函数)
答案 3 :(得分:-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是最简单的。如果它是相关的,你将在以后解决任何空间使用问题(拇指规则:总是使用“int”表示整数而不是其他类型,除非有一个非常具体的原因而不是早期优化)
修改强> 正如评论所说,这仅适用于整数,并且切换到字节不会(它会抛出异常)。 那么如果你试图解析“267”会发生什么? 恕我直言,它应该通过一个int,然后做一些边界测试,然后只投入一个字符。例如,通过atoi会导致极易出错。