c ++: преобразовать вектор <char>в двойной - PullRequest
2 голосов
/ 21 июня 2011

Я использую 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 ]

2 голосов
/ 21 июня 2011

Не делай этого. Отправьте строковое представление значения через сокет.

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;
2 голосов
/ 21 июня 2011

Работает с Integer без проблем.Но ...

Это наверняка будет не работать для целых чисел.По крайней мере, не для целых чисел, где sizeof(int) > 1!Потому что он не записывает только одно целое число, а распределяет байты в myVector по sizeof(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 предназначен для копирования объектов, а не необработанной памяти.

2 голосов
/ 21 июня 2011

Полагаю, вам нужно соответственно навести указатель, чтобы 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...