Как создать массив из 8 байтов, каждый из которых является случайным числом в C - PullRequest
1 голос
/ 04 марта 2010

как в заголовке, и каждый элемент массива iv должен содержать случайное число от 0 до 255. Я пробовал как:

char iv[8];
char buf[2];
int i, k;
srand(time(NULL));
for (i = 0; i <8; i++){
     k = rand()%256;
     iv[i] = (char)k;
}

Спасибо заранее.

Ответы [ 7 ]

5 голосов
/ 04 марта 2010

Вы должны использовать unsigned char для массива, а не char. Первый гарантированно сможет содержать значения от 0 до (по крайней мере) 255, но последний может не сможет содержать числа больше 127.

2 голосов
/ 04 марта 2010

Вы можете напрямую назначить возвращаемое значение rand () mod 256 для элементов массива:

char iv[8];
int i;
srand(time(NULL));
for (i = 0; i <8; i++)
  iv[i] = rand()%256;

Таким образом можно увидеть некоторые -ve числа в массиве iv, когда вы пытаетесь распечатать его как целое число. Допустим, rand()%256 дал 255, то есть 1111 1111. Очевидно, что самый важный бит установлен, поэтому при попытке напечатать его как целое число он будет интерпретирован как -ve число.

Чтобы избежать получения -ve чисел, вы должны объявить iv как массив беззнаковых символов:

unsigned char iv[8];
2 голосов
/ 04 марта 2010

В вашем коде нет ничего плохого. Это немного чрезмерно и «разговорчиво», когда дело доходит до генерации и хранения числа, и имеет магические константы там, где они не нужны, но это должно дать желаемый результат.

Цикл может быть сокращен до:

for (i = 0; i < sizeof iv; i++)
     iv[i] = (char) rand();

Конечно, случайность будет ограничена любой реализацией PRNG , которую использует ваш компилятор и / или библиотека.

0 голосов
/ 05 марта 2010

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

0 голосов
/ 04 марта 2010

U должен печатать, используя% u, а не% d. % u является беззнаковым символом printf, поэтому он должен учитывать знаковый бит и печатать все числа как положительные числа.

0 голосов
/ 04 марта 2010

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

0 голосов
/ 04 марта 2010

похоже, что ваше решение может быть примерно таким,

char myrand[8];
int *my1,*my2;
my1 = (int*)(myrand);
my2 = (int*)(myrand+4);
srand(time(NULL));
my1 = rand() % 0xffffffff;
my2 = rand() % 0xffffffff;

работает быстрее, вы видите. Кстати, я предполагаю, что int здесь 4 байта: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...