Мне нужна помощь. у меня есть 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 и ввода. Какой самый быстрый способ?
Заранее большое спасибо.
Если компилятор гарантирует, что между полями в структуре нет пробелов (обычно это происходит из-за упаковки), или вы можете использовать #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 бит.
Короче говоря, доступ к данным связи должен быть сделан наиболее надежным способом, проверяя каждый базовый элемент и ничего не предполагая.
Попробуйте reinterpret_cast. Это позволит вам произвольно разыграть char * в cmp *
http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx
В общем случае комментарий Джеймса Канцеса является правильным, вы не можете сравнивать это. Это, помимо прочего, связано с заполнение байтов.
Однако в конкретном случае используются следующие допущения;
Отправитель отправляет его прямо из структуры.
cmp c{ ...set variables... };
send(sockfd, (char*)&c, sizeof(c));
Короче говоря, это очень хрупкий способ транспортировки структур, и вы не должны делать это ни для чего, кроме простых тестов или быстрых взломов.