2015-12-01 149 views
0

我必须将以下结构复制到char []缓冲区。将结构复制到char []缓冲区

struct AMG_ANGLES {   
      unsigned char bIsEnCrypted; 
      unsigned char bIsError; 
      unsigned short  usErrorFlag; 
      unsigned char byteNumDABs; 
      unsigned short  usBagId; 
      unsigned short  usKvMa; 
      unsigned char byteDataType; 
    }; 

      AMG_ANGLES struct_data; 
      struct_data.bIsEnCrypted = 1; 
      struct_data.bIsError = 1; 
      struct_data.usErrorFlag = 2; 
      struct_data.byteNumDABs = 1; 
      struct_data.usBagId =10; 
      struct_data.usKvMa=20; 
      struct_data.byteDataType = 1; 

// here I am coping structure to a char buffer 
char sendbuf[sizeof(struct_data)] = ""; 
memcpy(sendbuf,(char*)&struct_data, sizeof(struct_data)); 

复制了前两个无符号字符数据和短(1,1,2)和大小的缓冲区只有3个字节。扩充数据不是复制。 请帮助我在哪里做错了。

我尝试以下方法也

 memcpy(sendbuf+0, &struct_data.bIsEnCrypted, sizeof(struct_data.bIsEnCrypted)); 
     memcpy(sendbuf+1, &struct_data.bIsError, sizeof(struct_data.bIsError)); 
     memcpy(sendbuf+2, &struct_data.usErrorFlag, sizeof(struct_data.usErrorFlag)); 
     memcpy(sendbuf+4, &struct_data.byteNumDABs, sizeof(struct_data.byteNumDABs)); 
     memcpy(sendbuf+6, &struct_data.usBagId, sizeof(struct_data.usBagId)); 
     memcpy(sendbuf+8, &struct_data.usKvMa, sizeof(struct_data.usKvMa)); 
     memcpy(sendbuf+10, &struct_data.byteDataType, sizeof(struct_data.byteDataType)); 

相同的结果我得到。

+0

如果将相同类型的成员放在一起,那么您的结构在内存中可能会更紧凑。 –

+0

也请注意,不同的编译器和不同的编译器在不同的设置上可能会以不同的方式填充结构。 –

+0

在memcpy之后我正在打印sendbuf的strlen int n = strlen(sendbuf);我得到n值只有3,同样发送到服务器应用程序。 – user3928249

回答

3

你的代码没问题;您确定缓冲区内容是否正确的方法存在缺陷。

你还没有告诉我们你是如何确定缓冲区的内容是错误的,但是从你的描述中我怀疑你做了类似printf("%s\n", sendbuf)的事情。那么,这是行不通的,因为你的缓冲区并不真正包含字符,它包含二进制数据。

具体来说,您是两个字节长,因为价值你存储在它2,这意味着它会被存储在sendbuf在连续的两个字节,一个字节将有0x02值和下一个字节将具有值0x00。 (从描述中的提示,假设您的硬件是“Little Endian”)。因此,当您尝试以字符串的形式查看sendbuf的内容时,printf()将在遇到0x00字节时立即停止打印。

所以,你的代码是正确的。继续将您的sendbuf发送到您的UDP套接字。

2

如果我读取“sendbuf”,我立即假定您正在将数据从一台计算机发送到另一台计算机。这些计算机会有不同的编译器,编译器会按照不同的顺序排列它们的字节。 memcpy不适用于所有编译器。

我建议你找到sendbuf的内容记录在哪里,并相应地分配各个字节。例如

sendbuf [0] = struct_data.bIsEncrypted; 
sendbuf [1] = struct_data.bIsError; 
sendbuf [2] = struct_data.uIsErrorFlag >> 8; 
sendbuf [3] = struct_data.uIsErrorFlag & 0xff; 

这使得独立代码的字节顺序的,独立的结构填充的,独立的项目进行重新排序的,一旦你不使用POD,等等。在你的情况下,我会打赌至少在byteNumDABs和usBagId之间填充,最后。 (字节2和字节3可能正好相反,这就是为什么你找到该数据结构的规格)。

相关问题