gpt4 book ai didi

c++ - 字符数组中的十六进制在写入套接字时导致随机字符

转载 作者:行者123 更新时间:2023-11-28 01:45:04 25 4
gpt4 key购买 nike

当与外部系统通信时,他们希望我在响应的末尾添加一个空字节。但是我遇到了一些问题:

//reading from socket

//sending response
std::string response = "hardcodedResponse";
int bufferSize = response.size() + 1; // +1 for the trailing zero
char buffer[bufferSize];

for (int i = 0; i < response.size(); i++)
{
buffer[i] = response[i];
}

buffer[bufferSize] = 0x00;

int socketfd = 1;
unsigned bytesWritten = 0;

while (bytesWritten < bufferSize)
{
bytesWritten += ::write(socketfd, buffer[bytesWritten], bytesToWrite - bytesWritten);
}

当我使用 telnet 向套接字发送内容时,我收到了一个响应:“hardcodedResponse”后跟一个 ▒。我认为这是有道理的,因为 0x00 是空的。但是,如果我在末尾添加 0x41 (A),我会收到“hardcodedResponse”+一个(看似)随机字符。如果我在写入套接字之前打印缓冲区的最后一个字符,它会打印“A”。如果外部系统也能收到正确的字节,这并不重要,但遗憾的是,它们收到的是随机字节。

我不知道为什么会这样。希望有人能帮助我理解。

最佳答案

除了所有套接字之外,还要查看缓冲区长度以及放置空值的位置:

std::string response = "hardcodedResponse";
int bufferSize = response.size() + 1; // +1 for the trailing zero
char buffer[bufferSize]; //Up to, but not including bufferSize
//0, 1, ... bufferSize-1

for (int i = 0; i < response.size(); i++)
{
buffer[i] = response[i];
}

buffer[bufferSize] = 0x00; //BOOM udefined behaviour

您为 null 创建了一个额外的字符,而不是两个,因此将 null 放在末尾而不是超出末尾。

buffer[bufferSize-1] = 0x00;

关于c++ - 字符数组中的十六进制在写入套接字时导致随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45507218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com