试图将struct成员复制到c中的字节数组

前端之家收集整理的这篇文章主要介绍了试图将struct成员复制到c中的字节数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将包含int,char和char数组的结构的成员复制到字节数组中以发送到串行线.到目前为止我有
  1. struct msg_on_send
  2. {
  3. char descriptor_msg[5];
  4. int address;
  5. char space;
  6. char cmdmsg[5];
  7. char CR;
  8. char LF;
  9. };
  10.  
  11. void switch_output_on()
  12. {
  13. int member;
  14. struct msg_on_send SendMsg_on[sizeof member] =
  15. {
  16.  
  17. };
  18. unsigned char buffer [ sizeof SendMsg_on[0] ];
  19. showbytes(buffer,serialize(buffer,SendMsg_on));
  20. }
  21.  
  22. /***************************************************************************
  23. * Function: ArrayBuild *
  24. * Purpose: Uses memcopy to transfer the struct members sequentially *
  25. * into an array of char *
  26. * Arguments: *
  27. * Returns: size_t i = a count of the number of bytes in the array *
  28. ***************************************************************************/
  29.  
  30. size_t ArrayBuild(unsigned char *dst,const struct msg_on_send *object)
  31. {
  32. size_t i = 0;
  33.  
  34. memcpy(&dst[i],&object->descriptor_msg,sizeof object->descriptor_msg);
  35. i += sizeof object->descriptor_msg;
  36.  
  37. memcpy(&dst[i],&object->address,sizeof object->address);
  38. i += sizeof object->address;
  39.  
  40. memcpy(&dst[i],&object->space,sizeof object->space);
  41. i += sizeof object->space;
  42.  
  43. memcpy(&dst[i],&object->cmdmsg,sizeof object->cmdmsg);
  44. i += sizeof object->cmdmsg;
  45.  
  46. memcpy(&dst[i],&object->CR,sizeof object->CR);
  47. i += sizeof object->CR;
  48.  
  49. memcpy(&dst[i],&object->LF,sizeof object->LF);
  50. i += sizeof object->LF;
  51.  
  52. return i;
  53. }
  54.  
  55. /***********************************************************************
  56. * Function: USARTWrite *
  57. * Purpose: Writes the array data to the USART data register *
  58. * Arguments: void *object = struct member *
  59. * size_t size = size of array remaining *
  60. * Returns: None *
  61. ***********************************************************************/
  62.  
  63. void USARTWrite(const void *object,size_t size)
  64. {
  65. const unsigned char *byte;
  66. for ( byte = object; size--; ++byte )
  67. {
  68. printf("%02X",*byte);
  69. }
  70. putchar('\n');
  71. }

当我获得此代码时,我不完全理解它是如何工作的.我可以看到memcpy接受结构的每个元素并使其成为由’i’变量索引的串行流,但我不知道USARTWrite函数如何将其分组为字符串,或者如何加载数组我的结构初始化.

对不起,这篇文章有点长,但我刚刚开始编程,并试图了解这个概念.

谢谢
戴夫

编辑:

哇,很快就有很多好的答案 – 谢谢你们.

slaz:这对我来说似乎合乎逻辑,我还没有真正考虑过这种方法,因为我还没有真正掌握指针,但我开始看到它们是C的重要组成部分,所以我应该有看看.

>这行代码将数据发送到我的UART,我将用什么代替包含消息内容的数组?看起来我错过了一个合乎逻辑的步骤,我有一个变量告诉我我的结构在哪里开始,它有多大,但没有数组要发送

  1. USART_SendData(USART1,message_on_contents[array_count]);

哈珀谢尔比:谢谢你的描述,它让我的想法更加清晰.

RGDS

戴夫

解决方法@H_502_29@
对不起,直到现在我才看到你的评论.
下面的代码在Linux上编译就好了,所以我希望它适合你.
printf()以十六进制打印,每个字节将获得2个字符.
  1. #include <stdio.h>
  2.  
  3. struct msg_on_send
  4. {
  5. char descriptor_msg[5];
  6. int address;
  7. char space;
  8. char cmdmsg[5];
  9. char CR;
  10. char LF;
  11. };
  12.  
  13. void USARTWrite(const void *object,size_t size)
  14. {
  15. const unsigned char *byte;
  16. for ( byte = object; size--; ++byte )
  17. {
  18. printf("%02X",*byte);
  19. }
  20. putchar('\n');
  21. }
  22.  
  23. int main (int argc,char**argv)
  24. {
  25. struct msg_on_send myMsg;
  26. unsigned char* ptr= (unsigned char*)&myMsg;
  27.  
  28. USARTWrite(ptr,sizeof(myMsg));
  29.  
  30. return 0;
  31. }

我希望这有帮助.

〜〜

猜你在找的C&C++相关文章