Обмен байтов структурой - PullRequest
       8

Обмен байтов структурой

0 голосов
/ 07 октября 2010

Хорошо, я не хочу задавать этот вопрос ... но здесь идет. Я пишу некоторый код на C на компьютере x86. Я хочу отправить структуру по сети, и я хочу преобразовать структуру в сетевой порядок байтов ... Я понимаю всю драму об упаковке и прагмах gcc упаковки ... я хочу знать, КАК мне конвертировать структура (или массив или любой такой произвольный блоб памяти) для сетевого порядка байтов.

Существует ли стандартная (Unix / Linux / Posix) функция вызова, которую я могу использовать, или я должен свернуть свой собственный.

х

Ответы [ 5 ]

7 голосов
/ 07 октября 2010

В принципе, вы можете пройти через структуру и вызвать htonl или htons в каждом поле uint32_t или uint16_t соответственно, присваивая результаты обратно или копии структуры.Однако я бы не рекомендовал такой подход.Он очень хрупкий и подвержен проблемам со структурным выравниванием и т. Д.

Если передача и получение данных не являются критически важными для производительности, я бы просто внедрил подходящие методы сериализации и десериализации для ваших структур.Вы можете записывать числовые значения по одному байту за раз в двоичном формате, выбирая, хотите ли вы записать сначала в наименее значимую или наиболее значимую часть.Но на самом деле, я бы порекомендовал выбрать современный текстовый формат сериализации, такой как json или (э-э, я не хочу это говорить) xml.Стоимость сериализации и десериализации текста довольно мала, а преимущества с точки зрения простоты отладки и расширяемости значительны.

Наконец, если вы хотите использовать текст, но находите json или xml слишком неприятными, слишком тяжелыми илислишком много кривой обучения, вы всегда можете просто использовать форматирование printf и scanf для чтения и записи структур в виде текста в фиксированном порядке.Запись всех числовых значений, включая числа с плавающей запятой, в шестнадцатеричном, а не десятичном виде, вероятно, немного повысит производительность и обеспечит точность обработки значений с плавающей запятой в обоих направлениях.Если у вас нет C99, другой вариант для чисел с плавающей запятой может состоять в том, чтобы разложить их в форму мантиссы / экспоненты и перекомпоновать их, используя frexp и ldexp.

0 голосов
/ 07 октября 2010

Также обратите внимание на структуры, которые были реализованы для решения этой конкретной проблемы, которые позволяют маршалировать / демаршаллить произвольно сложные структуры данных.Если вы собираетесь делать это в масштабе, превышающем несколько типов, используйте фреймворк.

  1. rpcgen / XDR : непусть все разговоры о RPC / клиент / сервер отпугнут вас.Вы можете использовать rpcgen для генерации процедур упорядочения / демаршаллинга для ваших данных, которые вы можете транспортировать любым удобным вам способом.
  2. Flick IDL Compiler Kit
  3. CORBA: большинство каркасов CORBA имеют IDL-компиляторы, например ACE TAO .
  4. ASN.1 : Если вам нравится немного болеть.Хотя очень экзотично.
0 голосов
/ 07 октября 2010

ОТВЕТ: Спасибо за ответы. Я полагаю, что ПРАВИЛЬНЫЙ ответ заключается в том, что для структур, массивов и таких больших двоичных объектов памяти вы ДОЛЖНЫ реализовывать свою собственную функцию сериализации ... это нормально ... Я рассмотрю это. Я хотел почувствовать себя хорошо, прежде чем попытаться сделать это ...

х

0 голосов
/ 07 октября 2010
0 голосов
/ 07 октября 2010

Если вы хотите отправлять данные по сети, вам нужно использовать функции упорядочения байтов сеть-хост и хост-сеть.

http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...