将std :: vector <char>转换为char *会导致有缺陷的字符

时间:2019-06-24 08:42:08

标签: c++ vector char

我的代码中有一个名为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 = 101data = "{\"password\":\"123456\",\"username\":\"test\"}"

这是我在打印字符时得到的结果:▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌

编辑:感谢您的所有帮助,我根据建议在最后返回了vector<char>,并采用了另一种方法将值转换为char*

2 个答案:

答案 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;

}