Двоичные Добавление больших массивов Char? - PullRequest
0 голосов
/ 20 февраля 2012

, поэтому у меня есть массив из 16 символов, определенный следующим образом ..

char CBlock[16];

В моей программе я использую шифрование в режиме CTR (не очень важно, просто говоря), и CBlock инициализируется случайным 128-битным шестнадцатеричным значением. Моя программа должна увеличить этот блок на 1 несколько раз, пока он зацикливается на блоке сообщений и выполняет шифрование. т.е.

for (i = 0; i < SOME_BIG_NUMBER; i++){
    CBlock = CBlock + 1; /*i know this isn't legal*/
    /*do some stuff*/
}

Есть ли простой способ сделать это дополнение? Есть ли способ, которым я могу просто рассматривать CBlock как один непрерывный блок данных? или я должен вручную реализовать двоичное (шестнадцатеричное) сложение с переносом и т. д.

РЕДАКТИРОВАТЬ: извините, объявление CBlock было неправильно.

Ответы [ 4 ]

1 голос
/ 20 февраля 2012

В общем, вы можете реализовать дополнение самостоятельно, отслеживая переносы.

unsigned char CBlock[16]; /* unsigned char is assumed to be at least an 8 bit type. */
/* Increment CBlock by 1. */

int carry = 1;
int i;

for (i=0; i<16; i++) {
    int sum = CBlock[i] + carry;
    CBlock[i] = (unsigned char) (sum & 0xff);
    carry = sum >> 8;
    if (carry == 0) {
        break;
    }
}

/* if (carry > 0) { we have overflowed} */
1 голос
/ 20 февраля 2012

Есть ли в вашей версии C собственные 128-битные числа, int128? В противном случае, возможно, попробуйте сделать ваш 128-битный блок из двух int64 с. Это значительно уменьшит проблему переноса.

0 голосов
/ 20 февраля 2012

Если вы можете предположить, что SOME_BIG_NUMBER достаточно мал, чтобы поместиться в uint64_t, и что ваша система имеет младший порядок (что почти наверняка), то вы можете просто сделать:

*(uint64_t *)&CBlock += 1;

или

*(uint64_t *)&CBlock = i;
0 голосов
/ 20 февраля 2012

C не имеет встроенной поддержки типов данных больше, чем машина регистрирует на (большинстве) микропроцессорах.

Хотя 128 бит становится «близким», этот тип обычно не поддерживается. Поэтому лучше всего либо использовать существующую библиотеку "bignum", либо написать свою собственную.

Если вам нужно только увеличить его, это не так уж сложно сделать самостоятельно. Для этого особого случая вы можете просто использовать пару uint64_t из <stdint.h>.

...