Рейтинг:
1
CPallini
Если вам нужно сериализовать[^] этот struct
затем функции memcpy[^] это путь, чтобы пойти
student s;
char a[100];
memcpy(a, &s, sizeof(s));
[обновление]Исправлена ошибка, благодаря
K5054[/обновление].
k5054
Так и должно быть memcpy(a, &s, sizeof s)
Обратите внимание, что sizeof нуждается в скобках только в том случае, если его операнд является типом, а не переменной.
Следует также отметить, что в этом случае содержимое a[] не читается человеком.
CPallini
Спасибо, что указал на ошибку.
Я знаю про размер. Это может быть просто вопрос стиля, во всяком случае, я предпочитаю использовать ненужные скобки.
Сериализованные данные могут быть (и на самом деле часто являются) не читаемыми человеком.
bijaynayak
привет, спасибо за предложение, но в соответствии с моим требованием ,
1:мне нужно передать данные стойки на несколько серверов (или мы можем сказать, что узлы diff
) & этот сервер понимает только char.
2: memcpy не внушаем, потому что он работает с адресом, с приемного конца, как получить те же структурные данные
CPallini
"memcpy не внушаем, потому что он работает с адресом, с приемного конца, как получить те же структурные данные"
Это и есть сама цель сериализации/десериализации. Вы проверили страницу Википедии, на которую я ссылался?
[no name]
Может быть:
student s;
char a[sizeof s];
memcpy(a, &s, sizeof s)
Рейтинг:
0
Rick York
В одну сторону :
void GetStudentDataString( student * ps )
{
const int bufferSize = 127;
char buffer[bufferSize+1] = {0};
snprintf( buffer, bufferSize, "%s, %d, %02d:%02d:%02d",
ps->name, ps->rollNumber, ps->yy, ps->mm, ps->dd );
}
k5054
Пара заметок
snprintf записывает не более байта размера, включая завершающий нулевой байт до места назначения, так что вам не нужно вручную его учитывать.
вы забыли указать члена dob при печати даты рождения. Таким образом, мы получаем следующее:
snprintf(buffer, sizeof buffer, "%s, %d, %02d:%02d:%02d", ps->name, ps->rollNumber, ps->dob.yy, ps->dob.mm, ps->dob.dd);
[no name]
ОП не уточнил, хотят ли они десериализоваться, и в этом случае это не сработает.
bijaynayak
привет pwasser, да нужно десериализовать char [], чтобы снова структурировать.
[no name]
Хорошо, тогда почему бы не использовать use memcpy () для копирования структуры в массив и memcpy () для копирования из массива обратно в структуру?
Rick York
ОП попросил команду, чтобы быть использованы.
[no name]
Хорошо, но как вы десериализуетесь обратно в структуру?
bijaynayak
Привет pwasser,
я сохраню все члены структуры в значении: separated после этого я буду
разделите это с помощью strtok (), который разделит вышеупомянутый буфер.
пример кода ниже:
студент структура studt2;
snprintf(buffer,bufferSize,"%s:%d:%d:%d:%d",studt.name,studt.rollNumber,studt.dob.dd,studt.dob.mm,studt.dob.yy);
ptr = strtok (буфер,":");
while (ptr != NULL)
{
// studt2.name= strtok(буфер);
strcpy(studt2.name,strtok(буфер));
studt2.rollNumber=Атой(ПТР);
ptr=strtok(NULL,":");
}
но как снова сохранить значения соответствующих членов ?
проблема в основном заключается в том, что studt2.name...
[no name]
Зачем идти этим путем? Это не очень хорошее решение. memcpy() решает все это аккуратно.
Rick York
Я писал циклы синтаксического анализа strtok так много раз, что сбился со счета. Вот типичный пример одного из них :
const size_t MaxTokens = 64; / / максимальное ожидаемое количество токенов
char * токены[MaxTokens] = {0};
const char * delimiters = " \t,;:.";
char * tokenString = buffer; / / текстовая строка для синтаксического анализа токенов
size_t count = 0;
в то время как( что strtok( tokenString, &усилителя;маркеры[счетчик] ) и усилитель; & ( графа &ЛТ; maxTokens ) )
{
tokenString = nullptr;
++считать;
}
// изучите токены здесь