word — Хранение байтовых шаблонов в переполнении стека

В настоящее время я работаю над проектом, который требует от меня сохранить 32-битный шаблон и проанализировать его. Мне нужен способ сохранить шаблон, такой как «1001 1001 1100 1000», в переменной, где он не будет интерпретироваться, например, как символ.

1

Решение

В C ++ 03 я бы использовал unsigned int или же unsigned long но ни один не указан точно 32-битным. unsigned long указано, чтобы иметь возможность держать по крайней мере значения [0, 232-1], поэтому теоретически он может быть больше 32 бит. В C ++ 11 я бы использовал uint32_t;

например 0000 0000 0000 0000 1001 1001 1100 1000 является 0x99c8, где 0x это шестнадцатеричный префикс.

uint32_t bitpattern = 0x998c

Если переменная bitpattern содержит желаемый битовый шаблон, и вы хотели бы передать его на консоль в виде шестнадцатеричного числа, вы бы использовали это:

std::cout << std::hex << bitpattern;
2

Другие решения

Если вы хотите преобразовать 32-битные шаблоны в int, вы также можете использовать контейнер STL <bitset> сделать работу:

std::bitset<32> bit(std::string("0001100111001000"));
long unsigned bit_number = bit.to_ulong();
std::string bit_string = bit.to_string();
1

Вы понимаете, что шаблон не 32-битный, верно?

Так как это не так, что-то вроде

unsigned long pattern = 0x99c8;

должно быть очень безопасно, вам будет трудно найти платформу, где unsigned long меньше 16 бит. Lke Армен сказал, если у вас есть uint32_t, используй это.

0

Помимо попыток использовать интегральный тип и битовую маску для создания собственной системы, вы также можете рассмотреть возможность использования редко используемой встроенной функции, а именно: битовые поля. Определение такого типа очень похоже на структуру, однако тип данных для каждого элемента является анонимным, а размер определяется числом битов. Есть некоторые накладные расходы, но не намного больше, чем вы пытались бы реализовать самостоятельно; фактически вы позволяете компилятору выполнять работу.

Если вам нужно преобразовать структуру туда и обратно между целочисленным типом (например, long), вы можете просто (ab) использовать reinterpret_cast:

struct bitSet {
bitSet(long in1) { //ctor, eg bitSet tmpBit(input);
*this = reinterpret_cast<bitSet>(in1);
}
long toLong() { //eg output=tmpBit.toLong;
return reinterpret_cast<long>(*this);
}

unsigned U0 : 4;
unsigned U1 : 4;
unsigned U2 : 4;
unsigned U3 : 4;
unsigned U4 : 4;
unsigned U5 : 4;
unsigned U6 : 4;
unsigned U7 : 4;
};

Преимущество этого состоит в том, что, хотя вы не можете гарантировать длину целочисленного типа, такого длинного, это гарантирует, что каждый элемент имеет длину всего 4 бита.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector