Простая передача данных в C
-
28-10-2019 - |
Вопрос
В настоящее время я переделываю приложение и обнаружил проблему с сериализацией некоторых данных.
Допустим, у меня есть массив размером mxn
double **data;
который я хочу сериализовать в
char *dataSerialized
с использованием простых разделителей (один для строк, один для элементов).
Десериализация довольно проста, она подсчитывает разделители и выделяет размер для хранения данных. Однако насчет функции сериализации, скажем,
serialize_matrix(double **data, int m, int n, char **dataSerialized);
Какой была бы наилучшая стратегия для определения размера, необходимого для массива char, и выделения для него соответствующей памяти?
Возможно, использовать экспоненциальное представление чисел типа double с фиксированной шириной в строке? Можно ли просто преобразовать все байты double в char и получить выровненный массив char sizeof (double)? Как сохранить точность чисел?
ПРИМЕЧАНИЕ.
Мне нужны данные в массиве символов, а не в двоичном формате и не в файле.
Сериализованные данные будут отправлены по сети с использованием ZeroMQ между сервером C и клиентом Java. Возможно ли, учитывая размеры массива и sizeof (double), что он всегда может быть точно реконструирован между этими двумя?
Решение
В Java есть неплохая поддержка чтения необработанных байтов и преобразования во все, что вы хотите. Вы можете выбрать простой проводной формат, а затем сериализовать его в C и десериализовать в Java.
Вот пример чрезвычайно простого формата с кодом для десериализации и сериализации.
Я написал немного более крупную тестовую программу, которую я могу скопировать куда-нибудь, если хотите;он создает массив случайных данных на C, сериализует, записывает сериализованную строку в кодировке base64 в стандартный вывод.Затем гораздо меньшая java-программа считывает, декодирует и десериализует это.
Код C для сериализации:
родовое словоКод Java для десериализации:
родовое словоДругие советы
Если вы пишете двоичный файл, вам следует подумать о хорошем способе сериализации фактических двоичных данных (64-битных) вашего генерируемого кода.Это может перейти от прямой записи содержимого двойника в файл (с учетом порядка байтов) к более сложным схемам нормализации сериализации (например, с четко определенным представлением NaN).Это действительно ваше дело.Если вы ожидаете в основном однородной архитектуры, вероятно, будет достаточно прямого дампа памяти.
Если вы хотите записать в текстовый файл и ищете представление ASCII, я бы категорически не рекомендовал использовать десятичное числовое представление.Вместо этого вы можете преобразовать 64-битные необработанные данные в ASCII, используя base64 или что-то в этом роде.
Вы действительно хотите сохранить точность, присущую генеральному кодированию кода!