c ++:将vector <char>转换为double </char>

时间:2011-06-20 20:59:14

标签: c++ vector buffer

我正在使用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)。为什么程序试图向后访问指针? 我很高兴,如果你能说我,我做错了什么。它是解码消息的好方法吗?

非常感谢你。

3 个答案:

答案 0 :(得分:2)

我猜您需要相应地转换指针,以使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));

答案 1 :(得分:2)

不要这样做。通过套接字发送值的字符串表示形式。

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;

答案 2 :(得分:2)

  

它可以毫无问题地与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用于复制对象,而不是原始内存。