将 unsigned char Buffer 拆分并存储到结构中
Splitting and storing a unsigned char Buffer into a struct
大家好Whosebugers,
为了上大学,我必须为微控制器创建一个简单的 TCP/IP
堆栈。
我有一个未签名的 char
Buffer
数据包,其中包含 Headers + 数据(如果存在)。
我为包含以太网结构 header 的数据包创建了一个 struct
,一个 IPv4 Header
结构,一个 ARP
header 和 2024
Byte
实际数据缓冲区。
我想将字节 0
dow 到 21
分配给以太网结构。
然后 22
到 53
到 IPv4
Header.
我现在的问题是如何使用 memcpy
从缓冲区复制特定间隔?
例如,如果我想将 buf[21 down to 53]
复制到 newbuf[32]
。
编辑:
因此,为了澄清这个问题以及我实际上想要完成的事情:
我通过以太网电缆将此数据包从 PC 发送到微控制器。
我想在微控制器上创建一个结构,其中包含您可以在图片中看到的所有信息。
目前我的方法是:
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 *)(ð_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, ð_buf[0], 6);
memcpy(header.senderMac, ð_buf[6], 6);
memcpy(header.type, ð_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
请注意,索引 21
到 53
实际上是 33
个字节。
大家好Whosebugers,
为了上大学,我必须为微控制器创建一个简单的 TCP/IP
堆栈。
我有一个未签名的 char
Buffer
数据包,其中包含 Headers + 数据(如果存在)。
我为包含以太网结构 header 的数据包创建了一个 struct
,一个 IPv4 Header
结构,一个 ARP
header 和 2024
Byte
实际数据缓冲区。
我想将字节 0
dow 到 21
分配给以太网结构。
然后 22
到 53
到 IPv4
Header.
我现在的问题是如何使用 memcpy
从缓冲区复制特定间隔?
例如,如果我想将 buf[21 down to 53]
复制到 newbuf[32]
。
编辑: 因此,为了澄清这个问题以及我实际上想要完成的事情:
我通过以太网电缆将此数据包从 PC 发送到微控制器。
目前我的方法是:
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 *)(ð_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, ð_buf[0], 6);
memcpy(header.senderMac, ð_buf[6], 6);
memcpy(header.type, ð_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]
tonewbuf[32]
因此您需要在源代码中使用指针算法,(您有 C++ 和 C 标记,您应该删除其中之一)。
Something like (C++)
memcpy(newbuf, &buf[21], 32); // from buf[21] with the size of 32 bytes
请注意,索引 21
到 53
实际上是 33
个字节。