我试图通过udp套接字发送以下字符数组0x11 0x00 0x00 0x00 0xb6 0x00 0x00 0x00 0x00 0xc7。我无法修复。字符数组总是在第一个0x00字符处终止。
尝试了字符串和字符数组,尝试了“\0”、“\0”和“\”、“0”,但似乎都不起作用。
string request_soladin_meter_data_command="\x11";
// sendudppacket (Soladin_ipaddress,5007+count,request_soladin_meter_data_command);
struct sockaddr_in udpaddr;
int udpsocket = socket(AF_INET, SOCK_DGRAM, 0);
if (udpsocket == -1)
{
printf("Could not create socket");
}
udpaddr.sin_family = AF_INET;
udpaddr.sin_port =htons(5007+count);
udpaddr.sin_addr.s_addr = inet_addr(Soladin_ipaddress);
//checks connection
if (connect(udpsocket,(struct sockaddr *)&udpaddr, sizeof(udpaddr)) < 0)
{
perror("Connection error");
}
// sends message
send(udpsocket,request_soladin_meter_data_command.c_str(),request_soladin_meter_data_command.length(),0);
type here
2条答案
按热度按时间f5emj3cl1#
字符串,总是以
\x00
字节结束,这就是它们的定义。std::string
的构造函数以const char *
为参数,查找00
字节,以计算字符串的长度,这是唯一的计算方法,没有其他方法。所有试图将
\x00
填充到文本字符串中的尝试都注定要失败。所讨论的痛苦的std::string
构造函数不知道这是一个虚假的尾随00
字节,而不是真实的的字节。因此,它总是将所有内容提取到它看到的第一个\x00
,这就是您的std::string
。请享受它。还有一些
std::string
构造函数不接受const char *
作为参数,而这些参数可以用来构造一个带有\x00
字节的实际std::string
。例如,一个构造函数接受迭代器到开始和定义新字符串的“过去一次”序列的末尾。或者,你可以构造一个空字符串并在其中填充一个0字节:现在:
这将很高兴地看到一个
std::string
,它有一个字节,length()
将是1,这就是你很高兴的小\x00
字节,通过套接字。ars1skjm2#
我建议使用字符串文字:https://en.cppreference.com/w/cpp/language/string_literal
如果你用
const char*
构造一个std::string,它会把它解释成一个c字符串,并使用strlen
逻辑来寻找长度。构造出初始化列表也是可能的。参见:https://en.cppreference.com/w/cpp/string/basic_string/basic_string