Вот такую интересную фигню только что обнаружил.
Писал конвертор данных в base64 и обратно вот код:
typedef boost::archive::iterators::istream_iterator<char> boost_istream_iterator;
typedef boost::archive::iterators::ostream_iterator<char> boost_ostream_iterator;
typedef boost::archive::iterators::insert_linebreaks<
boost::archive::iterators::base64_from_binary<
boost::archive::iterators::transform_width<boost_istream_iterator, 6, 8>
>, 76
> bin_to_base64;
typedef boost::archive::iterators::transform_width<
boost::archive::iterators::binary_from_base64<
boost::archive::iterators::remove_whitespace<boost_istream_iterator>
>, 8, 6
> base64_to_bin;
void test()
{
{
//фигня заключается вот в чём:
//если файлом для конвертации будет выступать любой бинарный или тектосвый файл, всё будет работать как надо
//а вот если будет файл zip формата
std::ifstream ifs("test.zip", std::ios_base::in|std::ios_base::binary);
std::ofstream ofs("test.arc", std::ios_base::out|std::ios_base::binary);
std::copy(
bin_to_base64(boost_istream_iterator(ifs >> std::noskipws)),
bin_to_base64(boost_istream_iterator()),
boost_ostream_iterator(ofs)
);
}
{
std::ifstream ifs("test.arc", std::ios_base::in|std::ios_base::binary);
std::ofstream ofs("test.rez", std::ios_base::out|std::ios_base::binary);
//то вот тут получим в конце неправильную конвертацию с выбросом исключения
//dataflow_exception::invalid_base64_character
std::copy(
base64_to_bin(boost_istream_iterator(ifs >> std::noskipws)),
base64_to_bin(boost_istream_iterator()),
boost_ostream_iterator(ofs)
);
}
}
Как объяснить такую фигню, Я пока незнаю. Буду копать.
Брал сторонний обычный конвертор в base64 и смотрел для всех файлов результат что через boost что через сторонний конвертор совпадает.
А вот для zip файлов отличие оказывается только в последнем байте.
22.06.11 23:11: Перенесено из 'C/C++'