LINUX.ORG.RU

Binary data in C variable (for BDB)


0

0

Подскажите, пожалуйста, как хранить некоторые бинарные данные (картинки, музыкальные файлы и проч.) в некоторой (возможно самостоятельно созданной) переменной на языке Си? Задача - иметь возможность хранить эти самые бинарные данные в базе данных Berkeley DB (нужен тип данных, который в SQL обзывается BLOB).

В интернете, книгах - искал. Заранее благодарен.


А в чем собственно проблема? В BDB как бы все данные типа BLOB (в том смысле, что BDB оперирует просто-напросто с блоками данных определенной длины).

Насчет "возможно, самостоятельно созданной" переменной -- это вы, батенька, как сильно загнули... Вообще-то в любой C программе почти все переменные "самостоятельно" созданные (ну там за исключением errno и т. п.)

aa5779
()
Ответ на: комментарий от aa5779

То, что BDB оперирует бинарными данными - я знаю =)

Насчёт самостоятельно созданной переменной - я имел ввиду typedef (struct).

Вообще меня смущает/непонятно одно: например, у меня есть такое определение структуры базы данных:

typedef struct attaches { unsigned char name[ATTACH_NAME_LENGTH]; //attach name unsigned char content; //attach content } node_attaches_data;

Правильно ли задан тип для content? Если да, то мне потом с этим значением работать как с обычной переменной (функциями копирования памяти)?

Не могу сказать, что являюсь гуру программирования на Си, потому прошу помощи...

xlex
() автор топика
Ответ на: комментарий от xlex

Нет, неправильно. content тоже должен быть массивом. Если длина данных заранее не известна, то можно писать так: content[1], только тогда где-то должна быть в явном виде указана длина (напр. поле content_length) и соответственно при выделении памяти и проч. нужно писать не malloc(sizeof(struct)) а malloc(sizeof(struct) + actual_data_length) (ну в таком духе).

gcc позволяет в таких случаях просто писать content[] -- это несколько лучше, но будет работать только с C99-совместимыми компиляторами

aa5779
()
Ответ на: комментарий от aa5779

Спасибо большое!

На всякий случай (уточню):

я объявляю структуру вида:

typedef struct attaches_data {

unsigned char name[NODE_ATTACH_NAME_LENGTH]; //attach name

unsigned char content[]; //attach content

unsigned int content_length; //attach content length

} node_attaches_data;

После чего, когда мне нужно заполнить content я делаю это используя mem* функции, а в поле длины вписываю значение. После чего, при всех операциях доставания этой структуры добавляю в значение выделямой памяти размер моего поля? Так?

xlex
() автор топика
Ответ на: комментарий от xlex

Не совсем правильно. (1) поле content должно быть последним (2) *перед* тем как заполнять content, нужно выделить блок данных требуемой длины. (т.е.

node_attaches_data *n = malloc(sizeof(node_attaches_data) + content_length);

n->content_length = content_length; memcpy(n->content, content, content_length);

(3) при "операциях доставания" (если имеется в виду доставание из BDB) собственно длина всего блока данных уже возвращается BDB в структуре DBT, а вот при помещении нужно, разумеется, помнить о том, чтобы корректно эту длину выставить в sizeof(...) + content_length

aa5779
()
Ответ на: комментарий от aa5779

Артём, более-менее понятно - большое, человеческое, спасибо! =)

Если не сложно, можешь или сюда или на почту (xlex0x835[AT]rambler[DOT]ru) скинуть адрес своего почтового ящика - если будут совсем запары, я бы у тебя спрашивал (честное пионерское - достаточно редко! =).

Заранее спасибо.

xlex
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.