提问人:Ricardoke 提问时间:12/14/2022 最后编辑:Ricardoke 更新时间:12/14/2022 访问量:93
如何将 uint8_t 数组添加到 char* 中
How to add a uint8_t array into a char*
问:
我有一个 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
};
答:
问题是我有并且uint8_t数组中间有 0x00,这使得这比我想象的要难,因为0x00十六进制也意味着数组的终止
在 C 中没有“终止数组”这样的东西。用作字符串的字符数组有 null 终止,但这在这里不适用。因此,该零件可以正常工作。memcpy
但是,您还有其他一些问题:
char datagram[4096]
等
对于保存原始二进制数据而言是不合适的、危险的和不可移植的。请改用。请参阅默认情况下是 char 签名还是未签名?char packet_bytes[]
char
uint8_t
struct iphdr *iph = (struct iphdr *)datagram;
由于对齐和严格的锯齿,这将导致未定义的行为。什么是严格的混叠规则?您不能通过指针强制转换将双关语从字符数组类型(尽管从“任何类型”到字符类型是可能的)。此外,您的结构可能包含填充,在这种情况下,它是额外的不可移植的,并且您不希望发送填充字节。(struct udphdr *)(datagram + sizeof(struct ip));
与上述问题相同的问题。
唯一可靠的方法是禁用结构填充,然后进入/退出结构。或者编写序列化/反序列化例程,一次访问一个结构成员,将其移入/移出原始数据。memcpy
评论
memcpy()
memcmp()