C在字符串末尾添加十六进制NUL而不会消失

时间:2018-07-24 08:34:57

标签: c string packet

我正在制作自己的网络数据包,并且协议规定有效负载应以空格(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;

但是,这会使我的代码看起来更糟。有什么想法吗?

2 个答案:

答案 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,因此您无需将其添加到字符串中。