我正在制作自己的网络数据包,并且协议规定有效负载应以空格(0x20)开头并以NUL(0x00)结尾
假想有效载荷
char *payload = " HELLOWORLD\x00";
但是,一旦我将数据包放在电线上并用Wireshk检查,数据包就不会以00结尾。我理解我的错误,但是我找不到在不立即消失或变成3030(十六进制为ascii)的情况下将00添加到字符常量的方法。
这是有效载荷发生的情况
48 45 4c 4c 4f 57 4f 52 4c 44
这就是我想要的
48 45 4c 4c 4f 57 4f 52 4c 44 00
我以前过分强调,后来再添加
int a = 0x00;
但是,这会使我的代码看起来更糟。有什么想法吗?
答案 0 :(得分:3)
您不能将\x00
放在char文字中,因为它是C字符串结尾的分隔符(您可以 ,但是大多数C字符串函数看不到它,并且最后还有一个终止符,为什么还要再添加一个?)。
在纯“字符数组”模式下有效:
const char payload[] = {' ','H','E','L','L','O','W','O','R','L','D','\x00'};
然后以sizeof(payload)
作为长度发送。
请注意,您可以这样做:
const char *payload = " HELLOWORLD";
并发送大小为payload
的{{1}}。其中将包括字符串结尾终止符,并且将遵守该协议。
答案 1 :(得分:3)
创建的字符串正确,并且已分配空字节。这由以下内容证明。
#include <stdio.h>
int main()
{
char a[] = "fred";
char b[] = "fred\x00";
printf("Hello World\n");
printf("size of %d\n",sizeof(a));
printf("size of %d\n",sizeof(b));
return 0;
}
哪个生产
Hello World
size of 5
size of 6
问题是strlen()或类似内容将在null处停止,因此添加的null不包括在长度的度量中。解决方法是通过另一种方法获得长度。不幸的是sizeof()并不是一个实际的运行时解决方案。或者只输出长度为strlen()+ 1的消息。请注意,您将已经拥有一个终止null,因此您无需将其添加到字符串中。