crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в помещение бинарных данных в строку
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
PAFOS Дата 6.6.2011, 16:19
  Как вариант (ну не пинайте за его глупость) можно перед вставкой перекодировать двоичные данный в BASE64.
BASE64 собственно и придумали чтобы двоичные данные передавать по текстовым протоколам а-ля HTTP.
Iron Bug Дата 6.6.2011, 7:22
  это ересь какая-то. я не знаю, какая библиотека используется автором вопроса, но вообще, сами SQLite имеют превосходную библиотеку и к ней есть документация, с примерами. и там есть функции работы с блобами sqlite3_blob_ХХХ.
jrjr Дата 5.6.2011, 18:05
 
Цитата(legat @ 19.5.2011, 11:21) *
Имеются запросы к SQLite БД по созданию таблицы и добавления в неё бинарных данных:
const std::string CREATE_FILE = "Create table files( id integer primary key autoincrement, file blob );";
const std::string ADD_FILE = "Insert into files( file ) values( '%s' ); Select last_insert_rowid( );";


Сам запрос я формирую в строке str следующим образом:
std::string str;
sprintf( ( char * )str.c_str( ), ADD_FILE.c_str( ), blobData );
executeSQL( str );


Вопрос:
Как мне передать в строку бинарные данные, которые могут содержать \0 и прочие служебные символы в середине, чтобы не было потери данных.
blobData предположительно char *. Не могу пока найти, что использовать для бинарных данным в строке формата вместо %s.

Можно, конечно, передавать в строку в цикле побайтово из blobData. Но это слишком не эффективно. К тому же не ясно, что делать с \0-ми.

Например экранировать их? Эта проблема настолько стара насколько существует SQL. По запросу "экранирование служебных символов" ты найдешь все что нужно.


Цитата(jrjr @ 5.6.2011, 19:03) *
Цитата(legat @ 19.5.2011, 11:21) *
Имеются запросы к SQLite БД по созданию таблицы и добавления в неё бинарных данных:
const std::string CREATE_FILE = "Create table files( id integer primary key autoincrement, file blob );";
const std::string ADD_FILE = "Insert into files( file ) values( '%s' ); Select last_insert_rowid( );";


Сам запрос я формирую в строке str следующим образом:
std::string str;
sprintf( ( char * )str.c_str( ), ADD_FILE.c_str( ), blobData );
executeSQL( str );


Вопрос:
Как мне передать в строку бинарные данные, которые могут содержать \0 и прочие служебные символы в середине, чтобы не было потери данных.
blobData предположительно char *. Не могу пока найти, что использовать для бинарных данным в строке формата вместо %s.

Можно, конечно, передавать в строку в цикле побайтово из blobData. Но это слишком не эффективно. К тому же не ясно, что делать с \0-ми.

Например экранировать их? Эта проблема настолько стара насколько существует SQL. По запросу "экранирование служебных символов" ты найдешь все что нужно.

Например на вскидку можно перед символом \0 вставить \ и все будет ок.
Litkevich Yuriy Дата 20.5.2011, 17:04
 
Цитата(legat @ 20.5.2011, 12:25) *
В терминах С++
Цитата(Litkevich Yuriy @ 19.5.2011, 16:59) *
Отвлечёмся от программирования на Си\Си++. Оставим один SQL.
legat Дата 20.5.2011, 9:25
 
Цитата(Litkevich Yuriy @ 19.5.2011, 14:59) *
legat, у меня вопрос:
Отвлечёмся от программирования на Си\Си++. Оставим один SQL. Как ты в запрос:
Insert into files( file ) values( '%s' )
собираешься помещать двоичные данные?

Двоичные данные - это массив байтов. В терминах С++ можно представить как массив char. Следовательно передаётся в sql запрос как строка. Проблема только в том, что символом \0 строка зарубается на середине и соответственно теряются данные. Я поэтому и хочу понять, как можно передать корректно двоичные данные в запрос. Понятно, что %s временное условно работающее решение.
Litkevich Yuriy Дата 19.5.2011, 13:59
  legat, у меня вопрос:
Отвлечёмся от программирования на Си\Си++. Оставим один SQL. Как ты в запрос:
Insert into files( file ) values( '%s' )
собираешься помещать двоичные данные?
legat Дата 19.5.2011, 10:21
  Имеются запросы к SQLite БД по созданию таблицы и добавления в неё бинарных данных:
const std::string CREATE_FILE = "Create table files( id integer primary key autoincrement, file blob );";
const std::string ADD_FILE = "Insert into files( file ) values( '%s' ); Select last_insert_rowid( );";


Сам запрос я формирую в строке str следующим образом:
std::string str;
sprintf( ( char * )str.c_str( ), ADD_FILE.c_str( ), blobData );
executeSQL( str );


Вопрос:
Как мне передать в строку бинарные данные, которые могут содержать \0 и прочие служебные символы в середине, чтобы не было потери данных.
blobData предположительно char *. Не могу пока найти, что использовать для бинарных данным в строке формата вместо %s.

Можно, конечно, передавать в строку в цикле побайтово из blobData. Но это слишком не эффективно. К тому же не ясно, что делать с \0-ми.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 18.4.2024, 8:07