我正在做一个简单的 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";
}
如果您想将
null
传输过去,不仅必须使用 memcpy
strlen(filename) + 1
,而且还需要相应地更新后续 memcpy
的目标指针。
memcpy(&blk_read_request[2 + strlen(file_name) + 1], mode_netascii, strlen(mode_netascii) + 1);
注意其中额外的
+ 1
。
郑重声明,作为 C++,您可能需要考虑使用比
char *
更高级别的类,它可以处理嵌入的 null
字符。
例如,以下打印“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;
}
这在 C++ 字符串中是自动的。
这个:
const char mode_netascii[] = "netascii";
相当于这个:
const char mode_netascii[] = { 'n', 'e', 't', 'a', 's', 'c', 'i', 'i', '\0' };
如果您需要处理将(或可能)包含空字节的数据,那么您通常会希望避免使用 C 样式字符串以及处理它们的函数。使用字符/字节数组并保留与缓冲区中数据长度相关的长度。
在 C++ 中,字节(或字符)向量非常适合此目的。
同样在 C++ 中,
std::string
类型可以包含空字符;但是,我建议避免使用它们并坚持使用 std::vector<char>
,因为将 string::c_str()
的结果传递给需要空终止字符串的东西很容易陷入一些错误陷阱。
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