Отправка массивов с плавающей точкой через сокеты c ++ между Windows и Linux - PullRequest
0 голосов
/ 28 сентября 2011

Я хочу отправить данные массива с плавающей точкой между Windows-клиентом и Linux-сервером (в двух направлениях).Большинство запросов на форуме касаются слегка продвинутых вопросов, таких как c ++, java и т. Д. Мой массив может быть размером 1024x1024.Какой самый лучший подход к этой проблеме?Пожалуйста, покажите псевдокод и пример реального кода, если это возможно.Я предпочитаю использовать для этого встроенную библиотеку winsock.Спасибо


Спасибо всем, я думаю, что отправка чисел с плавающей точкой в ​​виде массива char может быть самой простой из всех.Я не беспокоюсь о пропускной способности, так как я не буду отправлять данные так часто, но другие рекомендации кажутся слишком сложными для быстрого исправления.

Ответы [ 4 ]

2 голосов
/ 28 сентября 2011

Вы можете использовать библиотеку protobuf .

1 голос
/ 02 октября 2011

Если вы хотите быть действительно переносимым, то лучшим вариантом будет отправка поплавков в виде строк.

Тем не менее, если вы согласны с предположением, что все компьютеры будут использовать стандарт IEEE754 с плавающей запятой (что является допустимым допущением для программирования на ПК / Mac / Linux в наши дни), то вы можете просто отправить необработанные данные дословно (т.е. отправлять каждое число с плавающей запятой как 4 байта через memcpy ()).

Единственная складка - это если вы хотите иметь дело с машинами, которые используют другой порядок байтов ... например отправка от Intel на компьютер PowerPC. В этом случае одна из машин должна будет изменить порядок следования 4 байтов до того, как она отправит их (и после того, как она получит их), так что она все равно будет интерпретировать их так же, как и их аналог. (Нет функции ntohf () или htonf (), но вы можете поменять байты поплавком вручную, переместив его в int32_t с помощью memcpy (), затем поменяв местами int32_t и отправив его ... при получении, который вы бы получили ( ) данные в int32_t, поменяйте байтами int32_t, затем memcpy () результат в число с плавающей точкой. Обратите внимание, что приведения-и-присваивания здесь недостаточно, вы должны использовать memcpy (), чтобы скопировать данные из int32_t с плавающей точкой и наоборот - в противном случае отсутствие взаимодействия между регистрами с плавающей запятой и целочисленными в некоторых типах процессоров (например, Intel) укусит вас и даст неверные результаты)

0 голосов
/ 28 сентября 2011

Как говорит Лолло, вы можете использовать Google Proto Buffers.Но если вы просто хотите отправить эти поплавки, вам не нужны ВЕСЬ сложные вещи.

Вы можете сериализовать поплавки в байты, отправлять их и читать их на другом конце.Убедитесь, что оба компилятора / ОС используют формат IEEE с плавающей запятой (что справедливо для основных компиляторов / ОС).

Проверьте также этот вопрос .

0 голосов
/ 28 сентября 2011

Отправка поплавков между двумя разными блоками не очень хорошая идея. Внутреннее представление чисел с плавающей точкой не гарантируется стандартом, поэтому бит для битовой копии с плавающей точкой может привести к различным значениям на двух машинах.

Вы можете преобразовать числа с плавающей точкой в ​​строки и обратно, но это не особенно эффективно (для процессора или пропускной способности).

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