2017-02-21 13 views
0

Я получаю значение intfoo в функции, из которой мне нужно создать std :: vector из unsigned char. Размер вектора не должен быть больше необходимого. Это означает, что только если foo > 255 размер вектора может быть равен 2. Если foo > 0xFF размер вектора может быть 3, и если foo > 0xFFFFFF, вектор должен иметь размер 4. Я, похоже, не могу обернуть голову вокруг получения правый размер вектора в зависимости от размера int foo, а затем доступ к правильным байтам int до push_back на вектор. Любая помощь приветствуется! Благодаря!Копирование одиночных байтов целочисленного значения в вектор беззнаковых символов

Это то, что я до сих пор:

size_t foo2= foo; 
    size_t bytes = 0; 
    while (foo2!= 0) 
    { 
     foo2/= (1u << CHAR_BIT); 
     bytes++; 
    } 
    std::vector<unsigned char> myVec(bytes); 

    for (size_t i = 0; i < bytes; i++) 
     myVec[bytes-1-i]=(*((char*)&foo+ i)); 
+0

Иногда примеры кода сообщаются лучше ... – WhiZTiM

+0

Есть ли у вас какое-либо особое требование к подлинности? Начиная с младшего байта и используя 'push_back', будет, например, сделать ваш вектор мало-endian. – Useless

ответ

3

Почему бы не сделать это просто?

size_t foo2 = foo; 

std::vector<unsigned char> myVec; 
myVec.clear(); 

//special case if myVec should not be empty for foo = 0 
if(foo2 == 0){ 
    myVec.push_back(0); 
} 

while(foo2 > 0){ 
    unsigned char current_part = (unsigned char) (foo2 % 256); 
    myVec.push_back(current_part); 
    foo2 /= 256; 
} 

А может быть, наоборот, в зависимости от желаемого кончика. (#include < алгоритм> станд :: реверс (myVec.begin(), myVec.end());)

(мой код предполагает, что Foo> = 0, кстати, можно было бы хотеть, чтобы поймать ту или сделать an assert)

+0

'foo2% 255 ... foo2/= 255' Рассчитывая десятичное представление числа, разделите ли вы его на 9? –

+0

@ н.м. Да, иногда я делаю глупые ошибки. Спасибо, изменил это. – Aziuth

+0

'(unsigned char) foo2' уже имеет диапазон 0-255, он не добавляет ничего, чтобы использовать'% 256'. –