c ++如何在字符串中添加零位字节或null

1 c++ byte bits zero

我正在做一个TFTP的简单客户端实现.在这里,我需要以下列格式发送读取请求

/* send request 

      2 bytes    string     1 byte     string   1 byte
------------------------------------------------------
RRQ/  | 01/02 |  Filename  |   0  |    Mode    |   0  |
WRQ  -------------------------------------------------

*/
Run Code Online (Sandbox Code Playgroud)

在我之间我必须插入1个字节的零位值.但我无法增加这个价值.此外,如果我添加1个零位字节..这实际上意味着字符串终止字符比如何获得正确的strlen值.

如果有人可以帮我这个...

enter code here


const char opcode_read[2] ={'0','1'};
const char opcode_write[2] ={'0','2'};
const char opcode_data[2] ={'0','3'};
const char opcode_acknowledge[2] ={'0','4'};
const char opcode_error[2] ={'0','5'};  
const char mode_netascii[] = "netascii\0";
char blk_read_request[100];
char file_name[] = "rfc0791.txt\0";

memcpy(blk_read_request, opcode_read, 2);
memcpy(&blk_read_request[2], file_name, strlen(file_name) + 1);
memcpy(&blk_read_request[2 + strlen(file_name)], mode_netascii, strlen(mode_netascii) + 1);

for (int i = 0; i < strlen(blk_read_request); i++) {
    cout << i << " : " << blk_read_request[i] << " " << std::bitset<CHAR_BIT > (blk_read_request[i]) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 5

如果要传输空值,不仅必须使用"strlen(filename)+ 1"进行memcpy,而且还需要相应地更新后续memcpys的目标指针.

memcpy(&blk_read_request[2 + strlen(file_name) + 1], mode_netascii, strlen(mode_netascii) + 1);
Run Code Online (Sandbox Code Playgroud)

请注意那里的额外+1.

对于记录,作为C++,您可能希望考虑使用比"char*"更高级别的类,它可以处理嵌入的空字符.

例如,以下打印"8",并打开std :: stringstream作为形成数据包的更好方法:

#include <string>
#include <iostream>

int main()
{
    std::string x = "foo";
    x += '\0';
    x += "bar";
    x += '\0';

    std::cout << x.length() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)