0

我需要帮助。我有一个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 和输入。最快的方法是什么?

提前非常感谢。

4

3 回答 3

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 位。

简而言之,必须以最稳健的方式访问通信数据,检查每一个基本元素,不做任何假设。

于 2014-04-28T17:28:01.803 回答
0

试试 reinterpret_cast。这将允许您任意将 char * 转换为 cmp * http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx

于 2014-04-28T17:20:59.687 回答
0

在一般情况下,James Kantzes 的评论是正确的,你不能这样比较。除其他外,这是由于字节填充造成的。

但是在具体情况下有以下假设;

  • 发送方与接收方在同一 cpu 架构上
  • 发送方使用与接收方相同的编译器和链接器
  • 应用程序使用相同的编译器/链接器标志编译
  • ...其他事情...你明白了要点。
  • 发件人直接从结构中发送它。

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

所以简而言之,这是一种非常脆弱的结构传输方式,除了简单的测试或快速破解之外,你不应该这样做。

于 2014-04-28T17:34:49.710 回答