Байт из строки / int в C ++ - PullRequest
1 голос
/ 01 июня 2010

Я начинающий пользователь C ++ и хочу знать, как это сделать: Как я могу «создать» байт из строки / Int. Так, например, я:

string some_byte = "202";

Когда я хотел бы сохранить этот байт в файл, я хочу, чтобы файл был 1 байт вместо 3 байт. Как это возможно? Заранее спасибо, Тим

Ответы [ 4 ]

4 голосов
/ 01 июня 2010

Я бы использовал класс C ++ String Stream <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.
2 голосов
/ 01 июня 2010

Простой ответ ...

int value = atoi( some_byte ) ;

Есть еще несколько вопросов.

1) Какого размера int и важно ли это? (почти для всех систем это будет больше, чем байт)

int size = sizeof(int) ;

2) Важна ли Endianness ? (если посмотреть в функции htons () / ntohs ())

2 голосов
/ 01 июня 2010

В 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) );
0 голосов
/ 01 июня 2010

Используйте 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» в байт? Жусте иди за самое простое. Позже вы разберетесь с любой проблемой использования пробелов, если она уместна (правило большого пальца: всегда используйте «int» для целых чисел, а не для других типов, если нет особой причины, кроме ранней оптимизации)

EDIT Как говорится в комментариях, это работает только для целых чисел, и переключение на байты не будет (это вызовет исключение). Так что же произойдет, если вы попытаетесь разобрать «267»? ИМХО, он должен пройти через int, а затем сделать несколько тестов границ, а затем только бросить в char. Например, если вы пройдете через atoi, это приведет к экстремальным ошибкам.

...