strcmp — c ++ лучший способ сравнить байтовый массив со структурой

Мне нужна помощь. у меня есть unsigned char * и скажи, что у меня есть структура

struct{
int a=3;
char b='d';
double c=3.14;
char d='e';
} cmp;
unsigned char input[1000];
l= recv(sockfd,input , sizeof(cmp),0);

Я хочу сравнить CMP и ввода. Какой самый быстрый способ?

Заранее большое спасибо.

0

Решение

Если компилятор гарантирует, что между полями в структуре нет пробелов (обычно это происходит из-за упаковки), или вы можете использовать #pragna для устранения любых таких пробелов, то вы можете сравнить:

memcmp(&cmp, input, sizeof(stuct ThesSruct));

Или мой любимый:

cmp == *(struct TheStruct *)input // provided the struct doesn't contain pointers.

Но гораздо более безопасный способ — сравнить его по полям. Более того, подготовьте специальные функции для извлечения целых чисел, чисел с плавающей запятой и т. Д. Из исходного ввода. Например, извлечение int по индексу n может быть таким простым, как

*(int *)&input[n]

Но это может быть сложнее, например, смещение символов в 8, 16, 24 бит.

Короче говоря, доступ к данным связи должен быть сделан наиболее надежным способом, проверяя каждый базовый элемент и ничего не предполагая.

2

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

Попробуйте reinterpret_cast. Это позволит вам произвольно разыграть char * в cmp *
http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx

0

В общем случае комментарий Джеймса Канцеса является правильным, вы не можете сравнивать это. Это, помимо прочего, связано с заполнение байтов.

Однако в конкретном случае используются следующие допущения;

  • Отправитель находится на той же архитектуре процессора, что и получатель.
  • Отправитель использует тот же компилятор и компоновщик, что и получатель.
  • Приложения компилируются с одинаковыми флагами компилятора / компоновщика
  • …другие вещи … вы понимаете суть.
  • Отправитель отправляет его прямо из структуры.

    cmp c{ ...set variables... };
    send(sockfd, (char*)&c, sizeof(c));

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

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