Главная » Статьи » 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; } | |
Просмотров: 378 | | |
Всего комментариев: 0 | |