crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 13:41