簡體   English   中英

C ++:轉換向量 <char> 加倍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM