#c
#c
Вопрос:
Станет очевидно, что я новичок в программировании на C. (Я хорошо знаю другие языки, особенно PHP, но хотел попробовать C).
Мне удалось взломать некоторый код, который работает именно так, как я хочу, — и теперь я немного расширяю его — и я не могу понять, как это сделать.
Некоторая предыстория. Я работаю с этим объектом:
typedef struct
{
dsUint16_t stVersion;
... (omitted for clarity)
dsUint16_t objInfoLength;
char *objInfo;
... (omitted for clarity)
}ObjAttr;
Для меня * ObjInfo — это область, которую я могу использовать для хранения некоторых данных, которые будут объектом (struct?), Поэтому я создал с помощью typedef:
typedef struct {
unsigned int stVersion ; /* structure version */
const EVP_MD *digest_id ; /* digest name */
unsigned char digest_value ; /* digest calculated value (Variable length) */
// ... /* in the future I may want to store something else */
} digestInfo ;
У меня есть эта структура в файле .h, так что на нее можно ссылаться в 2 моих файлах .c.
Теперь в файле .c, где я храню эти данные (которые попадают в базу данных приложения), у меня есть этот код:
...
ObjAttr objAttr;
digestInfo digestO;
...
memset(amp;digestO,0x00,sizeof(digestO));
digestO.stVersion = 1;
digestO.digest_id = EVP_get_digestbyname(digest);
...
EVP_DigestFinal_ex(amp;mdctx, md_value, amp;md_len);
digestO.digest_value = *md_value;
objAttr.objInfo = *digestO;
objAttr.objInfoLength = sizeof(digestO);
При компиляции я получаю эту ошибку:
error: invalid type argument of ‘unary *’ (have ‘digestInfo’)
Я знаю это, потому что я пытаюсь сохранить объект DigestInfo в значение char — как мне это сделать?
Я пробовал комбинации
objAttr.objInfo = digestO;
objAttr.objInfo = amp;digestO;
Но все равно выдает ошибку (хотя последняя компилируется с предупреждением).
Я на правильном пути? (В основном я вычисляю MD5 некоторых данных, поступающих через STDIN (которые хранятся в приложении), и я хочу сохранить свои вычисления хэша в области «objInfo» ObjAttr.
Я хочу включить используемый алгоритм (md5, sha1 и т.д.) с результирующим хэшем, чтобы при получении этих данных я мог повторно запустить дайджест, чтобы убедиться, что я все еще получаю тот же хэш.
Если я справлюсь с этим, кто-нибудь не мог бы указать мне обратно в правильном направлении?
Правильно ли я сначала использую memset, чтобы обнулить память?
Должен ли я беспокоиться о том, что каждый из этих переменных (digest_id,digest_value) может иметь переменную длину?
Ценю помощь.
Комментарии:
1. Я не думаю, что это соответствует C , возможно, вам следует переназначить.
2. Добро пожаловать в Stack Overflow! »
.c
» файлы, использующиеmemset
иtypedef struct {
идентифицирующие код C, а не C . Я беру на себя смелость отредактировать этот вопрос, чтобы привлечь к вам лучшую аудиторию C, хотя вы можете оставить комментарий здесь, если считаете, что я сделал это неправильно.3. Спасибо Дрю, ценю помощь…
Ответ №1:
Поле objInfo является указателем на символ (char*), поэтому вы должны присвоить ему указатель, полученный с помощью amp; на «объект». Так objAttr.objInfo = amp;digestO;
что это ближайшая попытка, но amp;digest0 — это указатель на DigestInfo, поэтому вы, вероятно, захотите изменить
typedef struct
{
dsUint16_t stVersion;
... (omitted for clarity)
dsUint16_t objInfoLength;
char *objInfo;
... (omitted for clarity)
}ObjAttr;
Для
typedef struct
{
dsUint16_t stVersion;
... (omitted for clarity)
dsUint16_t objInfoLength;
digestInfo *objInfo;
... (omitted for clarity)
}ObjAttr;
Комментарии:
1. Бен, спасибо за твой ответ. Моя проблема в том, что я ссылаюсь на стороннюю библиотеку, поэтому я не могу изменить структуру ObjAttr. Есть ли другой способ, которым я могу скопировать свой объект в этот objInfo, который является допустимым C?
2. Но, похоже, у вас есть доступ к источнику (в конце концов, вы публикуете подмножество). В противном случае вам просто придется поддерживать его в другом месте.
3. У меня есть заголовочные файлы сторонней библиотеки, с которыми я компилирую (что является их структурой ObjAttr). Я предполагаю, что я не могу просто изменить заголовок, поскольку при ссылке на библиотеку это приведет к сбою — или может произойти какая-то другая ожидаемая вещь? Мою структуру DigestInfo я могу изменить в любом случае, мне нужно, но я хочу, чтобы эти «данные» хранились в ObjAttr.objInfo, чтобы, когда я вызывал их обратно из приложения (то есть сохранял их), они были в формате, который я понимаю и могу использовать.
4. тогда, я думаю, вы можете превратить DigestInfo в один форматированный строковый массив, поскольку это и есть objInfo . Как есть, вы ничего не можете сделать