c - 试图将结构成员复制到 c 中的字节数组

标签 c arrays serialization struct memcpy

我正在尝试将包含整数、字符和字符数组的结构的成员复制到字节数组中以发送到串行线路。到目前为止我已经

struct msg_on_send
{
    char descriptor_msg[5];
    int  address;
    char space;
    char cmdmsg[5];
    char CR;
    char LF;
};

void switch_output_on()
{
    int member;
    struct msg_on_send SendMsg_on[sizeof member] =
     {

    };
    unsigned char buffer [ sizeof SendMsg_on[0] ];
    showbytes(buffer, serialize(buffer, SendMsg_on));
}

/*************************************************************************** 
*   Function:   ArrayBuild                                                 *
*   Purpose:    Uses memcopy to transfer the struct members sequentially   *
*               into an array of char                                      *
*   Arguments:                                                             *
*   Returns:    size_t i = a count of the number of bytes in the array     *
***************************************************************************/    

size_t ArrayBuild(unsigned char *dst, const struct msg_on_send *object)
{
    size_t i = 0;

    memcpy(&dst[i], &object->descriptor_msg, sizeof object->descriptor_msg);
    i += sizeof object->descriptor_msg;

    memcpy(&dst[i], &object->address, sizeof object->address);
    i += sizeof object->address;

    memcpy(&dst[i], &object->space, sizeof object->space);
    i += sizeof object->space;

    memcpy(&dst[i], &object->cmdmsg, sizeof object->cmdmsg);
    i += sizeof object->cmdmsg;

    memcpy(&dst[i], &object->CR, sizeof object->CR);
    i += sizeof object->CR;

    memcpy(&dst[i], &object->LF, sizeof object->LF);
    i += sizeof object->LF;

    return i;
}

/*********************************************************************** 
*   Function:   USARTWrite                                             *
*   Purpose:    Writes the array data to the USART data register       *
*   Arguments:  void *object = struct member                           *
*               size_t size =  size of array remaining                 *
*   Returns:    None                                                   *
***********************************************************************/

void USARTWrite(const void *object, size_t size)        
{
    const unsigned char *byte;
    for ( byte = object; size--; ++byte )
    {
        printf("%02X", *byte);
    }
    putchar('\n');
}

当我获得这段代码时,我并不完全理解它是如何工作的。我可以看到 memcpy 获取结构的每个元素并将其放入由“i”变量索引的串行流中,但我不知道 USARTWrite 函数如何将其打包成一个字符串,或者如何加载数组我的结构初始化。

抱歉,这篇文章有点长,但我只是开始玩这个编程游戏,并试图了解这个概念。

谢谢 戴夫

编辑:

哇,很快就会有很多好的答案 - 谢谢你们。

slaz:这对我来说似乎合乎逻辑,我还没有真正考虑过这种方法,因为我还没有真正了解指针,但我开始看到它们是 C 语言的重要组成部分,所以我适本地看看。

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

    USART_SendData(USART1, message_on_contents[array_count]);
    

Harper Shelby:谢谢你的描述,它让我更清楚了。

研究成果

戴夫

最佳答案

抱歉,刚才才看到你的评论。 下面的代码在 Linux 上编译得很好,所以我希望它对你有用。
printf() 以十六进制打印,每个字节将得到 2 个字符。

#include <stdio.h>

struct msg_on_send
{
char descriptor_msg[5];
int  address;
char space;
char cmdmsg[5];
char CR; 
char LF; 
};

void USARTWrite(const void *object, size_t size)    
{
    const unsigned char *byte;
      for ( byte = object; size--; ++byte )                                     
      {   
          printf("%02X", *byte);
      }   
      putchar('\n');
}

int main (int argc, char**argv)
{
    struct msg_on_send myMsg;
    unsigned char* ptr= (unsigned char*)&myMsg;

    USARTWrite(ptr, sizeof(myMsg));

    return 0;
}

希望对您有所帮助。

~
~

关于c - 试图将结构成员复制到 c 中的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484357/

相关文章:

c# - 获取哪些值使数组中给定数字的总和的算法

c++ - 我的数组值如何被覆盖

php - 如何在 PHP 中反序列化 Perl Data::Dumper 输出

jquery - 一起序列化多个表单?

serialization - 如何在 Julia 中为结构实现自定义序列化/反序列化?

c - 在 C 中处理多个输入的输出

c - 将输入读入数组

c - 段错误信号处理程序 signint

c - 如何安装 pgAudit 扩展?

javascript - 将值插入数组会导致 undefined variable ,但可以在函数内工作