2011-06-20 73 views
2

我使用vector<char>发送,并通过套接字接收数据将翻一番。在这个向量中,我存储了不同类型的数据。无符号整数和双精度。 要从矢量解码数据,我使用copy函数。C++:转换矢量<char>

vector<char> myVector = ... smth; 
double value = 0.0; 
copy(myVector.begin(), myVector.begin() + sizeof(value), &value); 

它与整型没有问题。但是......

我的问题是,编译给出一个错误"free(): invalid pointer: 0x00000000006d0e30"。我检查,问题是与双重价值,而不是向量。我查看了双倍数值的地址(0x6d0e38)。为什么程序试图向后访问指针? 我会很高兴,如果你能说我,我做错了什么。这是解码信息的好方法吗?

谢谢你很多。

+3

后所有失败的代码。请注意'sizeof(double)> sizeof(int)'。不能依赖于接收者和发送者端数据的字节顺序,所以不能,这不是一个好的设计。 –

+1

请检查您的矢量的大小,而不管“但我知道这是超过sizeof(价值)!” – BatchyX

+0

这只是一个错误。在这个消息之后,我只有一长串Qt库(Backtrace)。 是的,我知道double比int大。当我编码矢量我采取了整个大小的双。 –

回答

2

它适用于Integer,没有问题。但...

它肯定会而不是工作整数。至少不适用于sizeof(int) > 1的整数!因为它不会写,只是一个整数,但流传于myVectorsizeof(T)整数字节,从而覆盖随机内存。 (见nightcracker的答案)

请只使用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用于复制对象,而不是原始内存。

+0

谢谢!我不知道。我认为C++ copy()只是C memcpy()的重新实现。 :) copy():“复制元素...”(http://www.cplusplus.com/reference/algorithm/copy/) 下次我应该仔细阅读。 –

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)); 
+0

嗯,我试过你的例子。编译没有收到错误消息。但是现在浮动值是错误的。它只是0.--( –

+0

权利似乎并没有工作 – log0

2

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

std::stringstream ss; 
double value = 0.0; 
ss << value; 

然后使用ss.str()或者如果你真的需要焦炭的向量:

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; 
+0

stringstream代表数据的二进制或字符形式?我需要一个二进制流 –

+0

为什么你会这样做?介绍转换类型之间的数据是〜双倍的数据以字节为单位加上串流开销OP需要二进制 – dcousens

+0

为什么你需要一个二进制表示?有很多原因你不想要这个,如果接收器有不同的方式来表示值(大的/ little endian,16/32/64bits ...) – log0

相关问题