Как конвертировать векторк инт? - PullRequest
4 голосов
/ 27 октября 2010

У меня есть vector<unsigned char> с двоичными данными.Мне нужно взять, скажем, 2 элемента из вектора (2 байта) и преобразовать его в целое число.Как это можно сделать не в стиле C?

Ответы [ 6 ]

6 голосов
/ 27 октября 2010

Пожалуйста, используйте оператор сдвига / побитовые операции.

int t = (v[0] << 8) | v[1];

Все предлагаемые здесь решения, основанные на приведении / объединении, имеют неопределенное поведение AFAIK и могут не работать на компиляторах, использующих строгое псевдонимы (например, GCC).

6 голосов
/ 27 октября 2010

Вы можете сделать:

vector<unsigned char> somevector;
// Suppose it is initialized and big enough to hold a uint16_t

int i = *reinterpret_cast<const uint16_t*>(&somevector[0]);
// But you must be sure of the byte order

// or
int i2 = (static_cast<int>(somevector[0]) << 8) | somevector[1];
// But you must be sure of the byte order as well
5 голосов
/ 27 октября 2010

v [0] * 0x100 + V [1]

4 голосов
/ 26 октября 2011

Ну, еще один способ сделать это - заключить вызов в memcpy:

#include <vector>
using namespace std;

template <typename T>
T extract(const vector<unsigned char> &v, int pos)
{
  T value;
  memcpy(&value, &v[pos], sizeof(T));
  return value;
}

int main()
{
  vector<unsigned char> v;
  //Simulate that we have read a binary file.
  //Add some binary data to v.
  v.push_back(2);
  v.push_back(1);
  //00000001 00000010 == 258

  int a = extract<__int16>(v,0); //a==258
  int b = extract<short>(v,0); //b==258

  //add 2 more to simulate extraction of a 4 byte int.
  v.push_back(0);
  v.push_back(0);
  int c = extract<int>(v,0); //c == 258

  //Get the last two elements.
  int d = extract<short>(v,2); // d==0

  return 0;
}

Шаблон функции extract также работает с double, long int, float и т. Д.,

В этом примере нет проверки размера.Мы предполагаем, что v фактически имеет достаточно элементов перед каждым вызовом extract .

Удачи!

3 голосов
/ 27 октября 2010

что значит "не в стиле С"? Использование побитовых операций (сдвигов и ор) для того, чтобы заставить это работать, не означает, что это "стиль C!"

что не так с: int t = v[0]; t = (t << 8) | v[1];?

1 голос
/ 27 октября 2010

Если вы не хотите заботиться о старшем / младшем порядке, вы можете использовать:

vector<unsigned char> somevector;
// Suppose it is initialized and big enough to hold a uint16_t

int i = ntohs(*reinterpret_cast<const uint16_t*>(&somevector[0]));
...