我需要帮助。我有一个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.
但更安全的方法是逐个领域进行比较。更重要的是,准备用于从原始输入中提取整数、浮点数等的特殊函数。例如,在索引 n 处提取一个 int 可能很简单
*(int *)&input[n]
但它可能更复杂,比如将字符移动到 8、16、24 位。
简而言之,必须以最稳健的方式访问通信数据,检查每一个基本元素,不做任何假设。
试试 reinterpret_cast。这将允许您任意将 char * 转换为 cmp * http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx
在一般情况下,James Kantzes 的评论是正确的,你不能这样比较。除其他外,这是由于字节填充造成的。
但是在具体情况下有以下假设;
发件人直接从结构中发送它。
cmp c{ ...set variables... };
send(sockfd, (char*)&c, sizeof(c));
所以简而言之,这是一种非常脆弱的结构传输方式,除了简单的测试或快速破解之外,你不应该这样做。