我需要帮助。我有一个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 :(得分:2)
如果编译器保证结构中的字段之间没有间隙(通常由于打包而发生),或者您可以使用#pragna来取消任何此类间隙,那么您可以通过以下任一方式进行比较:
memcmp(&cmp, input, sizeof(stuct ThesSruct));
或者,我的首选:
cmp == *(struct TheStruct *)input // provided the struct doesn't contain pointers.
但更安全的方法是逐场比较。甚至更多,准备从原始输入中提取整数,浮点数等的特殊函数。例如,在索引n处提取int可能就像
一样简单*(int *)&input[n]
但它可能更复杂,比如将字符移动到8,16,24位。
简而言之,访问通信数据必须以最强大的方式完成,检查每个基本元素而不是假设任何内容。
答案 1 :(得分:0)
尝试reinterpret_cast。这将允许您任意将char *转换为cmp * http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx
答案 2 :(得分:0)
在一般情况下詹姆斯Kantzes的评论是正确的,你无法比较那样。除其他外,这是由byte padding.
引起的然而,在具体情况下,有以下假设;
发件人直接从结构中发送。
cmp c{ ...set variables... };
send(sockfd, (char*)&c, sizeof(c));
因此,简而言之,这是一种非常脆弱的运输结构的方式,除了简单的测试或快速黑客攻击外,你不应该做任何事情。