boost base64->bin, bin->base64 (интересная фигня)
От: nen777w  
Дата: 21.06.11 12:15
Оценка:
Вот такую интересную фигню только что обнаружил.
Писал конвертор данных в 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++'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.