Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换向量<;无符号字符>;在不丢失数据的情况下,其中包含/0到char*? 我有一个服务器客户端程序,我尝试从我的C++服务器发送二进制数据到我的C客户端。当我试图将数据从向量转换为字符*时,我注意到只发送了一半的数据,我担心这可能是因为我的数据中包含\0_C++_Vector - Fatal编程技术网

转换向量<;无符号字符>;在不丢失数据的情况下,其中包含/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
!=<代码>字符(!=
签名字符
)。