как добавить (push_back) биты с побитовыми операторами - PullRequest
0 голосов
/ 24 апреля 2020

я работаю над шифрованием приватной строки. Я смешал много байтов, и большинство символов не в пределах 0-9, az, AZ, и это вызывает проблемы для меня.

, поэтому я собираюсь получить 6 бит для каждого символа, поэтому их значение будет быть между 0 и 63. Затем я буду использовать таблицу с 64 действительными символами ASCII. (я думаю, что base64-шифрование тоже делает что-то подобное)

, поэтому мой вопрос: как я могу добавить 2 символа, но с их битами?

например, если у меня есть массив байтов: { 105, 104} в двоичном виде: 01101001 01101000, поэтому я получаю первые 6 битов из первого символа, но я оставил 2 последних байта: 01 01101000, поэтому теперь я хочу «добавить» 2 бита (из предыдущего символа) + 4 биты первые от 2-го символа Вот что я хочу сделать: 010110

Я знаю, как получить 2 бита от 1-го символа и 4 сначала от 2-го символа. Я просто хочу, чтобы добавить (поразрядно) 01 + 0110 (= 22 в десятичном виде) и сохранить результат в новый символ

1 Ответ

0 голосов
/ 24 апреля 2020

Насколько я понимаю, вы хотите извлечь 6 бит данных каждый в 4 выходных байта для каждых 3 входных байтов, оставляя 2 старших бита в каждом выходном 0. Мы можем использовать побитовое И, чтобы замаскировать нужные биты.

Используйте маски 0x3f (двоичный код 00111111), 0x0f (двоичный код 00001111) и 0x03 (двоичный код 00000011) для маскировки 2, 4 или 6 битов от входов. Затем сдвиньте биты в правильную позицию и используйте побитовое ИЛИ, чтобы объединить их в одну переменную.

Учитывая три байта ввода (i1, i2, i3), вы можете получить выходные индексы (o1, o2, o3, o4) со следующим кодом.

o1 = (i1 >> 2) & 0x3f;
o2 = (i1 & 0x03) << 4 | (i2 >> 4) & 0x0f;
o3 = (i2 & 0x0f) << 2 | (i3 >> 2) & 0x03;
o4 = i3 & 0x3f;
  • o1 будет содержать старшие 6 битов i1.
  • o2 будет содержать младшие 2 бита i1 и старшие 4 биты из i2.
  • o3 будут содержать младшие 4 бита i2 и старшие 2 бита из i3.
  • o4 будут содержать младшие 6 бит из i3.

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

...