簡體   English   中英

c ++將字節數組與struct進行比較的最佳方法

[英]c++ best way to compare byte array to struct

我需要幫助。 我有一個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

在一般情況下詹姆斯Kantzes的評論是正確的,你不能這樣比較。 除其他外,這是由於字節填充。

但是在具體情況下有以下假設;

  • 發送方與接收方位於同一cpu架構上
  • 發送方使用與接收方相同的編譯器和鏈接器
  • 應用程序使用相同的編譯器/鏈接器標志進行編譯
  • ......其他的事情......你得到了要點。
  • 發件人直接從結構發送它。

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

簡而言之,這是一種運輸結構的非常脆弱的方式,除了簡單的測試或快速黑客之外,你不應該做任何事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM