C++ 如何使用多次memcpy将std::vector转换回<;无符号字符>;?
我想将C++中的一组值转换为代码>字符串> <代码> >代码>双倍,和<代码> TimeTyt< /Cord>:<代码> STD::向量 >。我正在为此使用C++ 如何使用多次memcpy将std::vector转换回<;无符号字符>;?,c++,vector,C++,Vector,我想将C++中的一组值转换为代码>字符串> >代码>双倍,和 TimeTyt< /Cord>: STD::向量 >。我正在为此使用memcpy,并在每次有新值时调用它。我刚刚意识到我必须向后调用它,以便在向量上按正确的顺序连接。转换完所有值后,我想再转换回去。我现在的做法是每次再次调用memcpy,将原始值转换回来。但是因为第一个值在向量的中间,所以我不能正确地转换它。 如何分别从向量中转换回所有值?下面是我的代码和输出。谢谢 int main(void) { std::string
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()
,您不能直接使用memcpystd::string
您的代码没有您认为的那样做,并且包含许多错误。我强烈建议不要尝试那样的字节操作。它们不可避免地会遇到类型(例如,STD::String),这些数据可能会存储堆上的数据。在C++中,您很少需要使用诸如“代码> MyCPy < /代码>之类的低级函数(大多数时候只需要与C API或与硬件接近的API通信),因此,在使用memcpy
时,您应该考虑是否真的做了正确的事情。@appleapplememcpy
执行字节复制。问题在于类型和大小,而不是功能。(尽管出于明显的原因,您不调用memcpy)string.data()
,但您不能直接使用memcpystd::string
。您的代码没有您认为的那样做,并且包含许多错误。我强烈建议不要尝试那样的字节操作。它们不可避免地会遇到类型(例如,STD::String),这些数据可能会存储堆上的数据。在C++中,您很少需要使用诸如“代码> MyCPy < /代码>之类的低级函数(大多数时候只需要与C API或与硬件接近的API通信),因此,在使用memcpy
时,您应该考虑是否真的做了正确的事情。@appleapplememcpy
执行字节复制。问题在于类型和大小,而不是功能。(尽管出于明显的原因,您不调用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());