c++ - 将未签名的char Buffer拆分并存储到结构中

标签 c++ c microcontroller

大家好,stackoverflowers,

对于大学,我必须为微 Controller 创建一个简单的TCP/IP堆栈。

我有一个未签名的char Buffer的数据包,其中包括 header +数据(如果存在)。

我为数据包创建了一个struct,其中包含用于以太网头的结构,用于IPv4 Header的结构,用于ARP头的结构以及用于实际数据的2024 Byte缓冲区。

我想将0字节21 dow分配给以太网结构。
然后将22降至53IPv4 header 。

我的问题现在是如何使用memcpy从缓冲区复制特定间隔?

例如,如果我想将buf[21 down to 53]复制到newbuf[32]

编辑:
因此,要澄清这个问题以及我实际上要完成的任务:

我通过以太网电缆将此数据包从PC发送到微 Controller 。
Packet
在微 Controller 上,我想创建一个结构,其中包含您可以在图片中看到的所有信息。

到目前为止,我的方法是:

   struct ethernetHeader{
        unsigned char receiverMac[6];
        unsigned char senderMac [6];
        unsigned char type [2];
    };

    //Not sure how to convert unsigned char to Bit or atleast integer
    struct IPv4Header{
        //4 Bit  Version
        //4 Bit IHL
        //8 Bit Type of Service
        //16 Bit Packet length
        //16 Bit Identification
        // 3 Bit Flags
        //13 Bit Fragment offset
        //8 Bit TTL
        //8 Bit protocol
        //16 Bit Header Checksum
        //32 Bit Source IP
        //32 Bit Destination IP
        //32 Bit Options -> NULL will be discarded 

    };

    struct arpHeader{
        //to be defined 
    };

    struct frame{
        struct ethernetHeader ethHdr;
        struct IPv4Header ip4Hdr;
        struct arpHeader arpHdr;
        unsigned char buffer[2024];

    };
while(1) {

        //postpones execution if no event is available
        event_mask = Event_pend(my_network_events,NON_EVENT_MASK,(EMAC_RX_EVENT | EMAC_TX_EVENT | EMAC_RX_NO_BUFFER),BIOS_WAIT_FOREVER);


        /*no receiver buffer was available
         * */
        if(event_mask & EMAC_RX_NO_BUFFER) {
            FreeEmacRxBuf();
            EMACRxDMAPollDemand(EMAC0_BASE);
        }


         //
         // Check for an RX Packet and read it.
         //
         if(event_mask & EMAC_RX_EVENT)
         {
             // Get the packet and set uip_len for uIP stack usage.
             //

             eth_rx_ptr =  PacketReceive((int32_t *)(&eth_len));
             if(eth_len > ETH_BUFSIZE)
                 eth_len = ETH_BUFSIZE;//truncate received packet length if necessary

             /* copy to private buffer and free */
             memcpy(eth_buf,eth_rx_ptr,eth_len);
             FreeEmacRxBuf();
             eth_rx_ptr = NULL;
             struct ethernetHeader header;

             memcpy(header.receiverMac, &eth_buf[0], 6);
             memcpy(header.senderMac, &eth_buf[6], 6);
             memcpy(header.type, &eth_buf[12],2);
    }
}

最佳答案

My question now is how do you use memcopy to copy specific intervals from the buffer?

For example if I want to copy buf[21 downto 53] to newbuf[32]


因此,您将需要在源代码中使用指针算法(您拥有C++ C标记,应删除其中的一个)。
Something like(C++)
memcpy(newbuf, &buf[21], 32); // from buf[21] with the size of 32 bytes
请注意,索引2153实际上是33字节。

关于c++ - 将未签名的char Buffer拆分并存储到结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61488736/

相关文章:

c++ - 从第二个排列开始时极度减速

c++ - 防止显示器开机

c - 是什么导致该程序出现段错误?

c++ - 观察者模式实现使用大量 RAM - 我如何找出位置和原因?

c++ - 在 CFrameWnd 上创建 Ctablctrl

c++ - C++中嵌套结构的 friend

gcc 编译 SDL 的正确命令行参数

c - 为什么程序的输出是这样呢?

sockets - Easy Button to UDP 数据包 - 控制板术语

c - UART中断无限循环微芯片