C ++: конвертировать unsigned long long int в вектор <char>и наоборот - PullRequest
4 голосов
/ 25 января 2012

Может кто-нибудь сказать мне, как преобразовать unsigned long long int в вектор и наоборот.

Для преобразования из unsigned long long int в вектор, я попробовал следующее:

unsigned long long int x;
vector<char> buf(sizeof(x));
memcpy( &buf[0], &x, sizeof( x ) );

Когда я проверил на х = 1234567890, это не удалось.Но когда я попробовал его для меньших значений x (скажем, 1-100), это сработало ...

Для преобразования вектора в unsigned long long int я использовал:

   unsigned long long int =  (unsigned long long int)buf[0];

Canкто-нибудь подскажет, как это сделать.

Ответы [ 3 ]

7 голосов
/ 25 января 2012

Просто помните, что копирование байтов вокруг не будет кросс-платформенным переносом.Ваш memcpy выглядит хорошо, так почему бы не создать его на обратном пути?То, что вы написали, просто берет первый байт вектора и преобразует его в unsigned long long, что объясняет, почему оно работает для небольших чисел.

Попробуйте вместо этого получить значение из вектора:1004 *

unsigned long long int x;
memcpy(&x, &buf[0], sizeof(x));
4 голосов
/ 25 января 2012

Вместо memcpy непосредственно в векторе вы можете использовать std::vector::assign для выполнения копирования.

#include <iostream>
#include <vector>

int main()
{
  unsigned long long int x = 0x0807060504030201;
  std::vector<char> v;

  v.assign( reinterpret_cast<char *>( &x ), reinterpret_cast<char *>( &x ) + sizeof( x ) );

  for( auto i = v.begin(); i != v.end(); ++i ) {
    std::cout << std::hex << static_cast<int>( *i ) << ' ';
  }
  std::cout << std::endl;

  // To convert back
  auto y = *reinterpret_cast<unsigned long long int *>( &v[0] );
  std::cout << "y = " << std::hex << std::showbase << y << std::endl;

  return 0;
}

Выход:

1 2 3 4 5 6 7 8 
y = 0x807060504030201
3 голосов
/ 25 января 2012

Вы должны изменить свою последнюю строку:

memcpy( &buf[0], reinterpret_cast<char*>(&x), sizeof( x ) );

Редактировать Я говорил глупости, эта строка в порядке, но ваше возвращение плохо - вы преобразовываетезначение вместо указателя:

unsigned long long int val = *reinterpret_cast<unsigned long long int*>(&buf[0]);
...