C++ 如何使用多次memcpy将std::vector转换回<;无符号字符>;?

C++ 如何使用多次memcpy将std::vector转换回<;无符号字符>;?,c++,vector,C++,Vector,我想将C++中的一组值转换为代码>字符串> >代码>双倍,和 TimeTyt< /Cord>: STD::向量 >。我正在为此使用memcpy,并在每次有新值时调用它。我刚刚意识到我必须向后调用它,以便在向量上按正确的顺序连接。转换完所有值后,我想再转换回去。我现在的做法是每次再次调用memcpy,将原始值转换回来。但是因为第一个值在向量的中间,所以我不能正确地转换它。 如何分别从向量中转换回所有值?下面是我的代码和输出。谢谢 int main(void) { std::string

我想将C++中的一组值转换为代码>字符串> <代码> >代码>双倍,和<代码> TimeTyt< /Cord>:<代码> STD::向量 >。我正在为此使用
memcpy
,并在每次有新值时调用它。我刚刚意识到我必须向后调用它,以便在向量上按正确的顺序连接。转换完所有值后,我想再转换回去。我现在的做法是每次再次调用
memcpy
,将原始值转换回来。但是因为第一个值在向量的中间,所以我不能正确地转换它。

如何分别从向量中转换回所有值?下面是我的代码和输出。谢谢

int main(void) {
    std::string lat = "lat->";
    double latitude = 13.123456;

    std::vector<unsigned char> result(sizeof(lat) + sizeof(latitude));

    std::cout << "copying to the vector" << std::endl;
    memcpy(result.data(), &latitude, sizeof(latitude)); // add string to the vector
    memcpy(result.data(), &lat, sizeof(result.size()) + sizeof(lat)); // add double to the same vector
    std::cout << "copied to the vector\n" << std::endl;

    std::cout << "printing the vector" << std::endl;
    for (int j = 0; j < result.size(); j++) {
        std::cout << result[j];
    }
    std::cout << std::endl;
    std::cout << "printed the vector\n" << std::endl;

    // testing converting back ...................
    std::cout << "printing back the original value" << std::endl;
    double d;
    std::string value;
    // make sure the vector is the right size
    if (result.size() != (sizeof(d) + sizeof(lat)))
        throw std::runtime_error {
                "Size of data in vector and float do not match" };
    // copy the bytes into the float
    memcpy(&value, result.data(), sizeof(value));
    std::cout << value;
    memcpy(&d, result.data(), sizeof(value) + sizeof(d));
    std::cout << d << std::endl;
    std::cout << "printed back the original value\n" << std::endl;
}

正如我在评论中所说的,除非你知道自己在做什么(你不知道),否则不要做那种事

写入内存缓冲区:

std::string lat = "lat->";
double latitude = 13.123456;

std::vector<unsigned char> result(lat.length() + sizeof(latitude));

std::cout << "copying to the vector" << std::endl;
std::memcpy(result.data(), &latitude, sizeof(latitude));             // add double
std::memcpy(result.data()+sizeof(latitude), lat.data(), lat.size()); // add raw string data
std::cout << "copied to the vector\n" << std::endl;

您可以看到,在从缓冲区复制字符之前,我们需要知道字符数(
lat.size()
)。这使得整个方法充其量也有问题。我强烈建议,在理解了这个例子之后,不要再做这种事情。

正如我在评论中所说的,除非你知道自己在做什么(你不知道),否则不要做那种事情

写入内存缓冲区:

std::string lat = "lat->";
double latitude = 13.123456;

std::vector<unsigned char> result(lat.length() + sizeof(latitude));

std::cout << "copying to the vector" << std::endl;
std::memcpy(result.data(), &latitude, sizeof(latitude));             // add double
std::memcpy(result.data()+sizeof(latitude), lat.data(), lat.size()); // add raw string data
std::cout << "copied to the vector\n" << std::endl;

您可以看到,在从缓冲区复制字符之前,我们需要知道字符数(
lat.size()
)。这使得整个方法充其量也有问题。我强烈建议,在理解了这个示例之后,不要再做这种事情。

string.data()
,您不能直接使用memcpy
std::string
您的代码没有您认为的那样做,并且包含许多错误。我强烈建议不要尝试那样的字节操作。它们不可避免地会遇到类型(例如,STD::String),这些数据可能会存储堆上的数据。在C++中,您很少需要使用诸如“代码> MyCPy < /代码>之类的低级函数(大多数时候只需要与C API或与硬件接近的API通信),因此,在使用
memcpy
时,您应该考虑是否真的做了正确的事情。@appleapple
memcpy
执行字节复制。问题在于类型和大小,而不是功能。(尽管出于明显的原因,您不调用memcpy)
string.data()
,但您不能直接使用memcpy
std::string
。您的代码没有您认为的那样做,并且包含许多错误。我强烈建议不要尝试那样的字节操作。它们不可避免地会遇到类型(例如,STD::String),这些数据可能会存储堆上的数据。在C++中,您很少需要使用诸如“代码> MyCPy < /代码>之类的低级函数(大多数时候只需要与C API或与硬件接近的API通信),因此,在使用
memcpy
时,您应该考虑是否真的做了正确的事情。@appleapple
memcpy
执行字节复制。问题在于类型和大小,而不是功能。(尽管出于明显的原因,您不调用memcpy)我将上一个
memcpy
更改为
memcpy(value.data()、result.data()+sizeof(latitude)、sizeof(value.data())+lat.size())我将上一个
memcpy
更改为
memcpy(value.data(),result.data()+sizeof(纬度),sizeof(value.data())+lat.size())
double d;
std::string value;
std::memcpy(&d, result.data(), sizeof(latitude));    // copy back the bytes of the double
value.resize(lat.length());
std::memcpy(value.data(),result.data()+sizeof(latitude), value.data(), lat.size());