C ++ Копировать 32-битное целое число в байтовый массив - PullRequest
1 голос
/ 27 марта 2012

Можно ли скопировать 32-битное значение в массив из 8-битных символов с одним присваиванием?

Скажем, у меня есть байтовый массив (uint8 *) с содержимым:

01 12 23 45 56 67 89 90

Можно ли скопировать в этот массив (с помощью приведения или чего-то еще) с помощью одного присваивания?Например, скопируйте что-то вроде 0x555555, чтобы мы получили:

55 55 55 55 56 67 78 90

Ответы [ 4 ]

3 голосов
/ 27 марта 2012
*( (unsigned int *)address_of_byte_buffer) = 0x55555555

Остерегайтесь размера int в 64-битном коде ... вам нужно будет найти тип данных, который последовательно равен 32 битам в обеих архитектурах, например uint32_t.

1 голос
/ 27 марта 2012

Вы можете использовать reinterpret_cast, хотя вам действительно нужно надевать ботинки со стальным носком во время его использования.

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    using std::vector;
    using std::copy;
    using std::back_inserter;
    using std::ostream_iterator;
    using std::cout;

    int a = 0x55555555;

    char* a_begin = reinterpret_cast<char*>(&a);
    char* a_end = a_begin + 4;

    vector<char> chars;

    copy(a_begin, a_end, back_inserter(chars));

    copy(chars.begin(), chars.end(), ostream_iterator<int>(cout, ", "));

    return 1;
}

Выход:

85, 85, 85, 85, 
0 голосов
/ 27 марта 2012

Вы можете использовать что-то вроде этого:
unsigned long* fake_long = reinterpret_cast<unsigned long*> (char_array); *fake_long = 0x55555555;

Но такое решение может работать на машине с прямым порядком байтов.Чтобы заставить его работать на машине с прямым порядком байтов (вероятно, вы хотите), вы должны преобразовать порядковый номер своей длинной переменной.

0 голосов
/ 27 марта 2012

Вы можете использовать reinterpret_cast для преобразования чего угодно во что угодно.

http://msdn.microsoft.com/en-us/library/e0w9f63b(v=vs.80).aspx

...