C ++中string / int的字节

时间:2010-06-01 16:18:43

标签: c++ string char int byte

我是C ++的初级用户,我想知道如何做到这一点: 如何从字符串/ int'创建'一个字节。所以例如我:

string some_byte = "202";

当我将该字节保存到文件时,我希望该文件是1个字节而不是3个字节。 怎么可能? 提前致谢, 添

4 个答案:

答案 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会导致极易出错。