c ++将字节数组与struct进行比较的最佳方法

时间:2014-04-28 17:16:36

标签: c++ strcmp memcmp

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

提前多多感谢。

3 个答案:

答案 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.

引起的

然而,在具体情况下,有以下假设;

  • 发件人与接收者处于相同的cpu架构
  • 发件人使用与接收者相同的编译器和链接器
  • 使用相同的编译器/链接器标志编译应用程序
  • ......其他的事情......你得到了要点。
  • 发件人直接从结构中发送。

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

因此,简而言之,这是一种非常脆弱的运输结构的方式,除了简单的测试或快速黑客攻击外,你不应该做任何事情。