Генерация 160-битной строки, которая хранится в массиве - PullRequest
1 голос
/ 13 ноября 2009

Я пытаюсь сгенерировать случайную 160-битную строку, которая должна храниться в массиве символов с именем str [20]. Очевидно, что массив содержит 20 символов. Как я могу изменить 160 бит на 20 символов / цифр? Я пытаюсь сделать это в C .. Любая помощь очень ценится, так как у меня закончились идеи, а затем служба поддержки в моем универмаге мне не поможет ..

Ответы [ 3 ]

1 голос
/ 13 ноября 2009

Это выглядит как работа, поэтому я дам вам только основы:

Ваша переменная будет выглядеть так:

char str[20];

Обратите внимание, что этот массив будет содержать байт данных , не обязательно "символы" (буквы, цифры и знаки пунктуации, как мы обычно понимаем слово "").

Если назначение не касается написания вашего собственного генератора случайных чисел, вы можете использовать псевдослучайный генератор времени выполнения C (в stdlib.h) и использовать две его функции: srand() и rand(). srand() используется для «заполнения» генератора (либо для заполнения с тем же значением, чтобы получить повторяемость, полезно во время отладки, либо с переменным числом (обычно связанным с системным временем), чтобы получить действительно случайные числа. производят целые случайные значения.

Поскольку rand () выдает значение от 0 до RAND_MAX (которое является «большим» числом), вам может потребоваться использовать модуль по модулю, чтобы получить правильную сумму. например

str [0] = char (rand ()% 256); // или что-то в этом роде.

rand (), однако, не будет выдавать целое число в 20 байтов, поэтому вам нужно получить несколько значений rand и соответствующим образом разместить их в массиве. Наиболее простым может быть вызов rand 20 раз и сохранение 1 байта каждый раз, но также можно хранить несколько байтов одновременно, используя указатели на части строки.

0 голосов
/ 13 ноября 2009

случайная строка для печати. Если вам все равно, печатается он или нет, уберите вызов min ((int) ''). Примечание. Я использую нулевой терминатор, чтобы сделать его правильной c-строкой, если вы этого не хотите, просто удалите часть, которая делает последний символ нулевым (а часть, которая его печатает, - который будет нулевой терминатор.)

#include <stdlib.h>

int main()
{
    char* str[20];
    int i;

    for (i = 0; i < 19; i++)
    {
        char[i] = min((int)' ', rand() % CHAR_MAX);
    }

    char[19] = '\0';

    puts(str);
}
0 голосов
/ 13 ноября 2009

160 битов - это 20 байтов, поэтому могут помещаться в 20 строковых символов.

Если N - это число, содержащее все ваши биты в строке, вы можете написать цикл следующим образом:

int i;

for (i=0; i<20; i++) {
  str[i] = (char)(N & 0xFF); 
  N >>= 8;
}

Редактировать: C действительно не имеет типа данных, который может содержать все ваши биты подряд. Поэтому вам нужно разделить цикл на несколько подциклов для каждой переменной, которая содержит часть ваших битов.

Если, с другой стороны, вы генерируете один бит за раз на лету, код может выглядеть следующим образом (при условии, что ваша случайная функция называется «random ()» и возвращает значение int, равное 0 или 1 ) * +1010 *

int i, j, b;

for (i=0; i<20; i++)
{
  b = 0;
  for (j=0; j<8; j++)
  {
    b |= (random() & 1);
    b <<= 1;
  }
  str[i] = (char)b;
}
...