ksacvet777.moy.su
Главная » Статьи » IT

Хранение двоичных данных в строковом виде
Во многих случаях двоичные данные удобно хранить в тексте 
(например скомпилированый шейдер).
Текст проще редактировать, бинарные же данные рудактировать трудновато.

Две функции. Одна для получения данных из строки (BinaryDataFromStr) 
другая для преобразования в строку (BinaryDataToStr)


Примечание:

  Таким способом можно хранить данные небольшого размера, например шейдеры
  или небольшие пиктограмки (которые не требуется часто редактировать или менять).
  Данные большого размера таким образом хранить нецелесообразно.

Функции:





#include <stdlib.h>
#include <assert.h>
#include <string>
#include <vector>


void BinaryDataToStr(std::string& dest, const void* data, const size_t datalen) throw (std::runtime_error)
{
    dest = "";

    const char * srcdata = (const char*)data;

    char buff [32];
    for(size_t c=0; c<datalen; c++)
    {
        const unsigned char curr = (unsigned char)srcdata[c];

        unsigned int temp = (unsigned int )curr >> 4; 
        sprintf(buff, "%X", temp );

        temp = (unsigned int )curr;
        temp = temp << 28;
        temp = temp >> 28;
        sprintf(buff+1, "%X", temp);

        dest += buff;


    }


}

void BinaryDataFromStr( std::vector<unsigned char>& dest, const std::string& line) throw (std::runtime_error)
{
    dest.clear();

    if(line.length() % 2 != 0)
    {
        throw std::runtime_error("bad string");
    }

    for(size_t c=0; c<line.length()-1; c++)
    {
        char temp[3] = {'\0'};
        temp[0] = line[c];
        temp[1]    = line[c+1];


        int value = 0;
        if( sscanf(temp, "%X", &value) != 1 )
        {
            throw std::runtime_error( std::string( std::string("unknown value: ") + temp ).c_str() );
        }

        dest.push_back( (unsigned char)value );

        c++;
    }


}





ну и небольшая проверка:


int main()
{
    std::string line;

    unsigned int data[4] = { 111111, 435434, 5423214, 81245345, 999999 };

    BinaryDataToStr(line, data, sizeof(unsigned int)*3 );


    memset(data,0,sizeof(unsigned int)*3);


    std::vector<unsigned char> dest;
    BinaryDataFromStr(dest, line);
    assert( dest.size() == sizeof(unsigned int) * 4 );
    memcpy(data, &dest[0], dest.size() );



    return 0;
}






Категория: IT | Добавил: ksacvet777 (23.01.2014)
Просмотров: 378 | Теги: текст, data, двоичные, binary, Text, представление, строка, данные | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: