Разделение массива char в последовательность целых чисел и чисел с плавающей точкой - PullRequest
1 голос
/ 04 июля 2011

Я пишу программу на C ++ для прослушивания потока tcp-сообщений из другой программы, чтобы дать данные отслеживания с веб-камеры.У меня подключен сокет, и я получаю всю информацию, но не могу разделить ее на нужные данные.

Вот формат поступающих данных:

8-байтовый заголовок: Строка из 4 символов, целое число

32-байтовое сообщение: целое число, число с плавающей точкой, число с плавающей точкой, число с плавающей точкой, число с плавающей точкой

Все это помещается в массив символов, называемый буфером.Мне нужно уметь разбирать разные байты на нужные мне примитивы.Я попытался создать меньшие вложенные массивы, такие как headerString, которые были заполнены циклически и скопировали первые 4 элемента массива буферов, и я вывел правильное значение «слышать» («CCV»).Но когда я пытаюсь сделать то же самое со следующим для элементов (чтобы получить целое число) и пытаюсь распечатать его, я получаю странные символы ascii, которые выводятся на печать.Я пытался преобразовать массив headerInt в целое число с помощью метода atoi из stdlib.h, но он всегда выводит ноль.

Я уже делал это в python, используя отличный метод unpack, является ли их альтернативойв C ++?

Любая помощь с благодарностью,

Иордания

Ссылки

Структура пакета CCV

Метод распаковки Python

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

Буфер содержит только необработанное изображение того, что вы прочитали поверх сеть. Вам придется конвертировать байты в буфере во что угодно формат вы хотите. Строка проста:

std::string s(buffer + sOffset, 4);

(Предполагая, конечно, что внутренняя кодировка символов одинакова как в файле & mdash; возможно, расширение ASCII.)

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

int getInt(unsigned char* buffer, int offset)
{
    return (buffer[offset    ] << 24)
        |  (buffer[offset + 1] << 16)
        |  (buffer[offset + 2] <<  8)
        |  (buffer[offset + 3]      );
}

или

int getInt(unsigned char* buffer, int offset)
{
    return (buffer[offset + 3] << 24)
        |  (buffer[offset + 2] << 16)
        |  (buffer[offset + 1] <<  8)
        |  (buffer[offset    ]      );
}

, вероятно, добьется цели. (Другие четырехбайтовые представления целые числа возможны, но они чрезвычайно редки. Точно так же преобразование неподписанных результатов сдвигов и или в int реализация определена, но на практике вышесказанное будет работать везде.)

Единственный совет, который вы даете в отношении представления поплавков, формат сообщения: 32 байта, минус 4 байта, оставьте 28 байтов для 5 поплавков; но 28 не входит в пять, так что я не могу даже догадываться о длина поплавков (за исключением того, что там должны быть некоторые отступы) где-то). Но преобразование с плавающей точкой может быть более или менее сложный, если внешний формат не совсем как внутренний формат.

0 голосов
/ 04 июля 2011

Примерно так может работать:

struct {
    char string[4];
    int integers[2];
    float floats[5];
} Header;

Header* header = (Header*)buffer;

Вы должны проверить, что sizeof(Header) == 32.

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