Шестнадцатеричные числа в Си

164
15 декабря 2016, 16:02

Передо мной стоит задача реализовать алгоритм SEAL2.0.

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

Я знаю, что Си поддерживает побитовые операции, шестнадцатеричные числа и может работать с ними. То есть можно сделать так:

char a,b,c;
a=0x2f;
b=0x1c;
c=a&b;// поразрядное "И"

Вопрос, можно ли как то использовать встроенные побитовые операции для больших шестнадцатеричных чисел в 32 знака? В каком формате тогда хранить такие большие числа, что бы с ними можно было работать?

Answer 1

Если речь идет о потоковом криптоалгоритме SEAL, то ТС имеет ввиду 32-х битовые числа

Очевидно у ТС непонимание, того, что с точки зрения процессора 16-тиричное или 10-тичное число это всего лишь представление для удобства человека и не более того. Процессор в любом случае оперирует с битами.

Соответственно в зависимости от используемого компилятора/архитектуры надо выбрать способ хранения 32-х битовых чисел. Примерно так:

Windows(IA-32): unsigned long int

Windows (Intel 64): unsigned long int

Windows (IA-64): unsigned long int

Linux (IA-32): unsigned long int

Linux (Intel 64): unsigned short int

Linux (IA-64): unsigned short int

Mac OS X (IA-32): unsigned long int

Mac OS X (Intel 64): unsigned short int

Далее уже спокойно производить битовые манипуляции с нужными типами.

P.S. Никогда не реализуйте криптографические примитивы самостоятельно - никогда! Впрочем, ТС это видимо не указ :) - может такой у него курсач или дипломная работа?

Answer 2

не бейте сразу я плохо вопрос наверно понял но все же выложу свой код

#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main(){
    // эмуляция файла
    string file("dsfdskfjksdjfjsdfkldjsfjsdfjsdfdidfsdhfjsdjfdsfdshfdhfgggfdgfdgdfgdfgdfgdfgdfrterghjghjhjhjghjhgjghjghfbvgrfhythgfhgfhgfhgfhtrhytrhgfhgfhhythjgngnjghjghjhgjdff");
    bitset<32> b1, b2, b3, b4, b5, result;
    for (size_t i = 0; i <= file.size() - 5; i += 5){
        b1 = file[i];
        b2 = file[i + 1];
        b3 = file[i + 2];
        b4 = file[i + 3];
        b5 = file[i + 4];
        cout << "1: " << b1 << "\thex: " << hex << b1.to_ulong() << dec << "\t\tdec: " << dec << b1.to_ulong() << endl;
        cout << "2: " << b2 << "\thex: " << hex << b2.to_ulong() << dec << "\t\tdec: " << dec << b2.to_ulong() << endl;
        cout << "3: " << b3 << "\thex: " << hex << b3.to_ulong() << dec << "\t\tdec: " << dec << b3.to_ulong() << endl;
        cout << "4: " << b4 << "\thex: " << hex << b4.to_ulong() << dec << "\t\tdec: " << dec << b4.to_ulong() << endl;
        cout << "5: " << b5 << "\thex: " << hex << b5.to_ulong() << dec << "\t\tdec: " << dec << b5.to_ulong() << endl;
        cout << "----" << endl;
        result = b1 | b2 | b3 | b4 | b5;
        cout << "example1 ----> 1 | 2 | 3 | 4 | 5 = " << result << endl;
        result = b1 & b2 & b3 & b4 & b5;
        cout << "example2 ----> 1 & 2 & 3 & 4 & 5 = " << result << endl;
        cout << "-------------------------------------------------------------------" << endl;
    }
    return 0;
}
READ ALSO
Создание формы на основе main.cpp в Qt Creator

Создание формы на основе main.cpp в Qt Creator

Есть код в maincpp, который описывает форму программы

192
Возврат значений из функции

Возврат значений из функции

Скажите, пожалуйста, есть ли какая-то видимая разница в работе 2-х функций?

168
Library not loaded

Library not loaded

Уважаемые форумчане!

234
Как скомпилить &ldquo;Hello world&rdquo; в С++ Qt в Linux?

Как скомпилить “Hello world” в С++ Qt в Linux?

Самый простой пример:

163