【问题标题】:c++ how to add a zero bits byte or null to a stringc ++如何将零位字节或null添加到字符串
【发布时间】:2009-09-30 02:14:39
【问题描述】:

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

/* send request 

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

*/

在两者之间我必须插入 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";
}

【问题讨论】:

    标签: c++ byte bits zero


    【解决方案1】:

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

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

    请注意其中的额外 +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;
    }
    

    【讨论】:

      【解决方案2】:

      如果您需要处理将(或可能)包含空字节的数据,那么您通常希望避免使用 C 样式字符串和处理它们的函数。使用字符/字节数组并保持与缓冲区中数据长度相关的长度。

      在 C++ 中,字节(或字符)向量非常适合。

      同样在 C++ 中,std::string 类型可以包含空字符就好了;但是,我建议避免使用它们并坚持使用std::vector&lt;char&gt;,因为很容易陷入将string::c_str() 的结果传递给期望空终止字符串的东西的一些错误陷阱。

      【讨论】:

        【解决方案3】:

        这在 C++ 字符串中是自动的。

        这个:

        const char mode_netascii[] = "netascii";
        

        相当于这个:

        const char mode_netascii[] = { 'n', 'e', 't', 'a', 's', 'c', 'i', 'i', '\0' };
        

        【讨论】:

          【解决方案4】:
          char *total_send_string = malloc(2+strlen(file_name)+sizeof(Mode)+3);
          memset(total_send_string, 0, strlen(total_send_string);
          //Then copy each member of the total send packet into the correct offset
          //Now you have the correct result
          

          【讨论】:

            猜你喜欢
            • 2017-09-16
            • 1970-01-01
            • 2016-02-29
            • 1970-01-01
            • 2018-11-09
            • 2013-10-09
            • 1970-01-01
            • 2015-03-09
            • 2023-03-17
            相关资源
            最近更新 更多