我的代码中有一个名为buildPacket
的函数,该函数接受一些参数,并将其转换为char*
并使用std::vector<char>
将它们加在一起,最后返回结果为char*
。问题是,在将向量转换为char*
之后,所有字符都变成了怪异字符。
我尝试使用其他方式将向量转换为char*
,例如使用reinterpret_cast<char*>
。当我从函数内部打印矢量的内容时,我得到了预期的结果,所以问题出在转换上。
该函数的代码:
char* buildPacket (int code, std::string data)
{
char* codeBytes = CAST_TO_BYTES(code);
std::vector<char> packetBytes(codeBytes, codeBytes + sizeof(char));
size_t dataLength = data.size() + 1;
char* dataLengthBytes = CAST_TO_BYTES(dataLength);
packetBytes.insert(packetBytes.end(), dataLengthBytes, dataLengthBytes + sizeof(int));
const char* dataBytes = data.c_str();
packetBytes.insert(packetBytes.end(), dataBytes, dataBytes + dataLength);
return &packetBytes[0];
}
CAST_TO_BYTES
宏:
#define CAST_TO_BYTES(OBJ) static_cast<char*>(static_cast<void*>(&OBJ));
此功能的目的是获取输入并从中构建数据包,以便稍后通过套接字发送,该数据包的格式由1个字节长的代码,4个字节长的数据长度和可变数据组成。长度。
我输入的信息是code = 101
和data = "{\"password\":\"123456\",\"username\":\"test\"}"
这是我在打印字符时得到的结果:▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
编辑:感谢您的所有帮助,我根据建议在最后返回了vector<char>
,并采用了另一种方法将值转换为char*
。
答案 0 :(得分:5)
您正在返回一个指向局部变量内部的指针。您应该更改代码以使vector<char>
在buildPacket
函数之外有效(例如,通过返回而不是char*
来实现)。
答案 1 :(得分:2)
您可以尝试此解决方案。我使用STL可以使您要实现的目标更加清晰。您的代码中还有一个未定义的引用,可能导致无法预测的崩溃。
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
// Better return std::vector<char>
char* buildPacket(int code, const std::string& data)
{
auto result = data;
result.append(1, static_cast<char>(code));
char* ret = new char[data.size() + 2];
ret[data.size() + 1] = '\0';
std::copy(result.begin(), result.end(), ret);
return ret;
}
std::vector<char> buildPacketStl(int code, const std::string& data)
{
std::vector<char> ret;
std::copy(data.begin(), data.end(), std::back_inserter(ret));
ret.push_back(static_cast<char>(code));
return ret;
}
int main() {
std::cout << buildPacket(65, "test") << std::endl;; // 65 -> A
auto stl= buildPacketStl(65, "test"); // 65 -> A
std::copy(stl.begin(), stl.end(), std::ostream_iterator<char>(std::cout, ""));
std::cout << std::endl;
}