Как отправить float [] через UDP + Unsigned-Long-Operator-Curiosity

Я пишу приложение C ++, которое считывает несколько напряжений с устройства. Я получаю эти измерения в float[] и я хочу отправить этот массив через UDP в MATLAB-Script.

C ++ — функция sendto должна получить char[] буфер, и я действительно понятия не имею, как преобразовать float[] в char[] буфер, так что я могу легко собрать его в MATLAB. Есть идеи?

Еще одна проблема, с которой я столкнулся — это

addr.sin_addr = inet_addr("127.0.0.1");

inet_addr возвращает long без знака, но мой компилятор сообщает мне, что оператор = не принимает тип unigend long с правой стороны. Есть идеи по этому поводу?

2

Решение

Вы всегда можете рассматривать любую переменную объекта как последовательность байтов. Для этой цели явно разрешено (и не нарушать псевдонимы или составлять наказание типов) переинтерпретировать любой указатель объекта как указатель на первый элемент в массиве байтов (т.е. любой char тип).

Пример:

T x;
char const * p = reinterpret_cast<char const *>(&x);

for (std::size_t i = 0; i != sizeof x; ++i) { /* p[i] is the ith byte in x */ }

Для вашего случая:

float data[N];
char const * p = reinterpret_cast<char const *>(data);

write(fd, p, sizeof data);
5

Другие решения

Решите, хотите ли вы отформатировать UDP-сообщения как текстовые или двоичные. Если текст, вы можете конвертировать числа с плавающей точкой, используя boost :: lexical_cast. Строковое значение в сообщении UDP можно оформить любым способом (значения, разделенные запятыми, символы новой строки и т. Д.), Или вы можете использовать известный формат, такой как JSON.

Если вы хотите передать двоичные данные, выберите известный формат, такой как XDR, который используется ONC RPC, и используйте существующие библиотечные инструменты для создания двоичных сообщений.

Что касается ошибки inet_addr, addr.sin_addr является структурой in_addr. Вам необходимо присвоить результат члену s_addr строки sin_addr следующим образом:

addr.sin_addr.s_addr = inet_addr("127.0.0.1");
1

В вашем посте два вопроса. Я считаю, что это не так, как должно быть.

Что касается float [] -> byte [] conersion — вы должны проверить, как matlab хранит переменные с плавающей точкой. Если по какой-либо причине он использует тот же формат, что и ваш компилятор, только для настройки вашего компьютера и т. Д., Вы можете просто отправить их в виде байтового массива []. В любом другом случае — несовместимый формат байтов с плавающей запятой, несколько машин — вы должны написать ручное преобразование. Сначала каждый float для (например) строки, а затем много float. Ваша строка может выглядеть так:

1.41234;1.63756;456345.45634

Что касается addr.sin_addr — я думаю, что вы делаете это неправильно. Вы должны получить доступ

addr.sin_addr.s_addr = inet_addr("1.1.1.1");

0
По вопросам рекламы [email protected]