[英]c++: convert vector<char> to double
我正在使用vector<char>
通过套接字发送和接收数据。 在此向量中,我存储了不同类型的数据。 无符号整数和双打。 为了从矢量解码数据,我正在使用copy
功能。
vector<char> myVector = ... smth;
double value = 0.0;
copy(myVector.begin(), myVector.begin() + sizeof(value), &value);
它可以毫无问题地与Integer一起使用。 但...
我的问题是,编译给出错误"free(): invalid pointer: 0x00000000006d0e30"
。 我检查过,问题出在双精度值,而不是向量。 我看了两倍值的地址是( 0x6d0e38
)。 为什么程序尝试向后访问指针? 如果您能说我,我会很高兴我做错了。 这是解码消息的好方法吗?
非常感谢。
我想您需要相应地转换指针,以使ptr++
使用正确的大小( sizeof(char)
,而不是sizeof(double)
):
vector<char> myVector = ... smth;
double value = 0.0;
std::copy(myVector.begin(), myVector.begin() + sizeof(value),
reinterpret_cast<char*>(&value));
不要这样 通过套接字发送值的字符串表示形式。
std::stringstream ss;
double value = 0.0;
ss << value;
然后使用ss.str()
或者如果您真的需要一个char向量:
std::vector<char> v(ss.begin(), ss.end());
-编辑-
如果您确实需要保留数据二进制文件,请执行
std::vector<char> v(sizeof(double));
double val = 0.5;
std::memcpy(&v[0],(char*)&val,sizeof(val));
...
double* out = (double*)&v[0];
std::cout << *out << std::endl;
它可以毫无问题地与Integer一起使用。 但...
它肯定不会为整数的工作。 至少对于sizeof(int) > 1
整数不是! 因为它将不会只写入一个整数,而是将myVector
的字节分布在sizeof(T)
整数上,从而覆盖了随机内存。 (请参阅“爆竹的答案”)
请只使用memcpy
进行这种复制:
vector<char> myVector = ... smth;
double value = 0.0;
assert(myVector.size() == sizeof(double));
memcpy(&value, &myVector[0], std::min(myVector.size(), sizeof(double)));
// as an alternative to the assert + std::min() above, you could also throw
// an exception if myVector.size() == sizeof(double) does not hold.
// (that's what I'd do if the size should always match exactly)
memcpy
正是针对这种情况(复制原始内存)而制作的,我认为这里没有理由使用其他任何东西。 使用std::copy
不能使它成为更好的C ++,尤其是当您没有正确执行它时。 std::copy
用于复制对象,而不是原始内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.