Как десериализовать сетевые данные в разные примитивы? - PullRequest
0 голосов
/ 17 ноября 2010

Я уверен, что это очень распространенная операция при выполнении любого вида сетевого программирования (или ввода-вывода с файлами), но я не могу найти ответ.

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

Я написал некоторый базовый сетевой код, который считывает данные из сокета и сохраняет данные в буфере, который объявлен следующим образом:

char buffer[24];

Это мой код десериализации:

for (int i=0; i<6; i++) {
    float *pf = reinterpret_cast<float*>(buffer + i*sizeof(float));
    printf("%f\n", *pf);
}

, но это приводит к сбою моей программы.

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

Ответы [ 3 ]

1 голос
/ 17 ноября 2010

У вас есть буфер в 24 байта, но вы работаете с 24 * sizeof(float) байтами, что довольно много.

char buffer[24 * sizeof(float)];
0 голосов
/ 17 ноября 2010

Если они действительно отправляют поплавки - что я бы не советовал, если у вас есть выбор - тогда вам придется немного взломать.библиотека, которую я написал, чтобы делать именно такие вещи.Работает на Windows (MSVC) и Linux (GCC).Это может не работать на других платформах!Используйте на свой страх и риск.

/**************  UTILITY ******************************/
template<class Val> Val ntohx(const Val& in)
{
    char out[sizeof(in)] = {0};
    for( size_t i = 0; i < sizeof(Val); ++i )
        out[i] = ((char*)&in)[sizeof(Val)-i-1];
    return *(reinterpret_cast<Val*>(out));
}

template<> uint16_t ntohx<uint16_t>(const uint16_t & v)
{
    return ntohs(v);
}

template<> uint32_t ntohx<uint32_t>(const uint32_t & v)
{
    return ntohl(v);
}

template<> uint64_t ntohx<uint64_t>(const uint64_t & v)
{
    uint32_t ret [] =
    {
        ntohl(((const uint32_t*)&v)[1]),
        ntohl(((const uint32_t*)&v)[0])
    };
    return *((uint64_t*)&ret[0]);
}
template<> float ntohx<float>(const float& v)
{
    uint32_t const* cast = reinterpret_cast<uint32_t const*>(&v);
    uint32_t ret = ntohx(*cast);
    return *(reinterpret_cast<float*>(&ret));
}

template<class Val> bool ieee_isnan(const Val& val)
{
    // According to the IEEE Standard for floating-point numbers, 
    // NaNs have the interesting attribute of always returning
    // false in comparisons; even to themselves.
    // All platforms we currently support use IEEE floating points,
    // so this should work. [Dib]
    return val != val;
};
0 голосов
/ 17 ноября 2010

См. ntohs () и друзья.

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