如何将 uint8_t 数组添加到 char* 中

How to add a uint8_t array into a char*

提问人:Ricardoke 提问时间:12/14/2022 最后编辑:Ricardoke 更新时间:12/14/2022 访问量:93

问:

我有一个 char *data,它是一个数据报,表示我想发送的数据包,但我需要在上面插入一个uint8_t数组。

// Datagram to represent the packet
char datagram[4096], source_ip[32], *data, *pseudogram;

// zero out the packet buffer
memset(datagram, 0, 4096);

// IP header
struct iphdr *iph = (struct iphdr *)datagram;

// UDP header
struct udphdr *udph = (struct udphdr *)(datagram + sizeof(struct ip));

// Data part
data = datagram + sizeof(struct iphdr) + sizeof(struct udphdr);
uint8_t packet_bytes[] = { 0xff, 0xff, 0x81, 0x01, 0x01 };
memcpy(data, packet_bytes, 5);

这样做可以让我插入我需要的东西并且它可以工作,但问题是我有并且uint8_t中间有 0x00 的数组,这使得这比我想象的要难,因为0x00十六进制也意味着数组的终止,我怎样才能让它与这个数组一起工作?

char packet_bytes[] = {
  0xff, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x30,
  0x13, 0x43, 0x00, 0x01, 0x01, 0x01, 0x02, 0x00,
  0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
  0x06, 0x00, 0x00, 0x10, 0x01, 0x01, 0x00, 0x63,
  0x02, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x05,
  0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x04, 0x00,
  0x0a, 0x00, 0x03, 0x01, 0x00, 0x11, 0x77, 0x25
};
c char hex memcpy uint8t

评论

2赞 user253751 12/14/2022
0x00并不意味着数组的终止。
0赞 user253751 12/14/2022
...除非你说它确实如此。你说有吗?如果你说它确实如此,那就不要再这么说了,因为显然这个数组在中间而不是在末尾有一个0x00。
0赞 CuriousPan 12/14/2022
什么是 char*?它是否指向字符数组?
0赞 Ingo Leonhardt 12/14/2022
只有函数 tha 意味着 tp 处理字符串关心0x00。等,所以它们不会被用来处理任意数组memcpy()memcmp()
1赞 Gerhardh 12/14/2022
网络标头显然不是字符串。任何 0 字节都不意味着数组就此结束。重要的是提供的长度。

答:

1赞 Lundin 12/14/2022 #1

问题是我有并且uint8_t数组中间有 0x00,这使得这比我想象的要难,因为0x00十六进制也意味着数组的终止

在 C 中没有“终止数组”这样的东西。用作字符串的字符数组有 null 终止,但这在这里不适用。因此,该零件可以正常工作。memcpy

但是,您还有其他一些问题:

  • char datagram[4096]
    对于保存原始二进制数据而言是不合适的、危险的和不可移植的。请改用。请参阅默认情况下是 char 签名还是未签名?
    char packet_bytes[]charuint8_t

  • struct iphdr *iph = (struct iphdr *)datagram;
    由于对齐和严格的锯齿,这将导致未定义的行为。什么是严格的混叠规则?您不能通过指针强制转换将双关语从字符数组类型(尽管从“任何类型”到字符类型是可能的)。此外,您的结构可能包含填充,在这种情况下,它是额外的不可移植的,并且您不希望发送填充字节。

  • (struct udphdr *)(datagram + sizeof(struct ip));与上述问题相同的问题。

唯一可靠的方法是禁用结构填充,然后进入/退出结构。或者编写序列化/反序列化例程,一次访问一个结构成员,将其移入/移出原始数据。memcpy

评论

0赞 Lundin 12/14/2022
@user694733 是的,这是一个明显的错别字,谢谢。