转换向量<;无符号字符>;在不丢失数据的情况下,其中包含/0到char*? 我有一个服务器客户端程序,我尝试从我的C++服务器发送二进制数据到我的C客户端。当我试图将数据从向量转换为字符*时,我注意到只发送了一半的数据,我担心这可能是因为我的数据中包含\0
我喜欢这样:转换向量<;无符号字符>;在不丢失数据的情况下,其中包含/0到char*? 我有一个服务器客户端程序,我尝试从我的C++服务器发送二进制数据到我的C客户端。当我试图将数据从向量转换为字符*时,我注意到只发送了一半的数据,我担心这可能是因为我的数据中包含\0,c++,vector,C++,Vector,我喜欢这样: const char* response = reinterpret_cast<char*>(requestResult.response.data()); [0]: 204 'Ì' [1]: 0 '\0' [2]: 0 '\0' [3]: 0 '\0' [4]: 12 '\f' [5]: 123 '{' [6]: 34 '\"' [7]: 115 's' [8]: 116 't'
const char* response = reinterpret_cast<char*>(requestResult.response.data());
[0]: 204 'Ì'
[1]: 0 '\0'
[2]: 0 '\0'
[3]: 0 '\0'
[4]: 12 '\f'
[5]: 123 '{'
[6]: 34 '\"'
[7]: 115 's'
[8]: 116 't'
[9]: 97 'a'
[10]: 116 't'
[11]: 117 'u'
[12]: 115 's'
[13]: 34 '\"'
[14]: 58 ':'
[15]: 49 '1'
[16]: 125 '}'
当我检查转换后的结果时,我只看到数据中的第一个字节(204-‘Ì’),这有点问题:]
发送本身是使用socket.cpp使用此函数完成的:
{
if (send(sc, (char*)message, strlen((char*)message), 0) == INVALID_SOCKET)
{
throw std::exception("Error while sending message to client");
}
}
如何将这样的数据转换为字符*以便正确发送所有数据
当我检查转换后的结果时,我只看到数据中的第一个字节(204-‘Ì’)
如何检查,字符串打印?这不是字符串,而是大小为requestResult.response.size()
的数据缓冲区。如果您相应地打印它,您将看到没有数据丢失
这是双倍正确的,因为在您显示的代码中没有进行数据处理,data()
返回指向内部数据缓冲区的指针,并且不做进一步的更改
我并不完全清楚为什么在JSON的前四个字节中会有随机垃圾,但最简单的方法是使用requestResult.response.data()+4
。此外,无需重新解释任何内容,数组中的项目已经是char
添加发送功能后进行编辑:如上所述,只需使用正确的大小:
send(sc, requestResult.response.data(), requestResult.response.size(), 0)
当我检查转换后的结果时,我只看到数据中的第一个字节(204-‘Ì’)
如何检查,字符串打印?这不是字符串,而是大小为requestResult.response.size()
的数据缓冲区。如果您相应地打印它,您将看到没有数据丢失
这是双倍正确的,因为在您显示的代码中没有进行数据处理,data()
返回指向内部数据缓冲区的指针,并且不做进一步的更改
我并不完全清楚为什么在JSON的前四个字节中会有随机垃圾,但最简单的方法是使用requestResult.response.data()+4
。此外,无需重新解释任何内容,数组中的项目已经是char
添加发送功能后进行编辑:如上所述,只需使用正确的大小:
send(sc, requestResult.response.data(), requestResult.response.size(), 0)
你的问题在于我
strlen((char*)message)
strlen
将在“c字符串”中的第一个空字符处停止,因此,在第一个空字符之前,您只能获取数据。幸运的是,您可以通过传递向量的大小而不是使用strlen
来解决这个问题。看起来像
send(sc, (char*)message, name_of_vector.size(), 0)
你的问题在于我
strlen((char*)message)
strlen
将在“c字符串”中的第一个空字符处停止,因此,在第一个空字符之前,您只能获取数据。幸运的是,您可以通过传递向量的大小而不是使用strlen
来解决这个问题。看起来像
send(sc, (char*)message, name_of_vector.size(), 0)
如果您使用的是处理C字符串的函数,它将在空字节处停止。应该使用函数发送数组,而不是字符串;它应该将长度作为参数。获取requestResult.response的大小,并将其用作发送的长度。如果您使用的是处理C字符串的函数,它将在空字节处停止。应该使用函数发送数组,而不是字符串;它应该将长度作为参数。获取
requestResult.response
的大小,并将其用作发送长度。转换unsigned
需要cast。我发送的是二进制数据,然后是一些Json,以及项目的一些奇怪要求。感谢您的回答,谢谢:D@Jarod42我不相信你。事实上,我假定send
(POSIX套接字函数)采用const void*
,它将接受有符号或无符号字符,因此根本不需要强制转换。但实际上,可能不需要无符号转换。我的观点是“数组中的项已经是char
”,这是学究式的错误,未签名的char
!=char
(!=signed char
)。转换unsigned
需要cast。我正在发送二进制数据,然后发送一些Json,这是项目的一些奇怪要求。感谢您的回答,谢谢:D@Jarod42我不相信你。事实上,我假定send
(POSIX套接字函数)采用const void*
,它将接受有符号或无符号字符,因此根本不需要强制转换。但实际上,可能不需要无符号转换。我的观点是“数组中的项已经是char
”,这是学究式的错误,未签名的char
!=<代码>字符(!=签名字符
)。