我正在尝试使用“gcry_randomize”填充数组,其中每个条目都是四个字节。
我认为因为long用4个字节表示而我只需要正数,所以我使用带有64个条目的无符号长指针数组。然后我使用gcry_randomize函数用四个字节填充每个条目并尝试将其打印出来。有关printf函数的编译器错误,但它正在运行。
unsigned long int* random_numbers[64];
for(index = 0; index < 64; index++){
gcry_randomize( random_numbers[index], 4, GCRY_STRONG_RANDOM);
printf("Random number: %lu \n", random_numbers[index]);
}
然而,结果并不是真正随机的,并且不是我预期的大小(4个字节而不是1个字节):
Random Number 0: 32535136
Random Number 1: 32535168
Random Number 2: 32535200
Random Number 3: 32535232
Random Number 4: 32535264
我应该将指针更改为unsigned char指针,然后将其转换为长整数吗?我的代码的下一步将是以模数计算该数字,因此需要一个长整数。 另一种选择是创建一个256字节的随机字符串,然后将字符串拆分为4个字节的部分,将其转换为long并保存。我用这种方法遇到的问题是我不知道如何读取char字符串的特定部分。
答案 0 :(得分:0)
gcry_randomize
使用随机字节填充缓冲区。所以,你可能得到的是4或8个随机字节,具体取决于你的架构。
你可以这样做
unsigned long int random_numbers[64];
for(index = 0; index < 64; index++) {
gcry_randomize(&random_numbers[index], sizeof(random_numbers[index]), GCRY_STRONG_RANDOM);
printf("Random number: %lu \n", random_numbers[index]);
}
您之前所做的是将未初始化的指针传递给gcry_randomize,这会导致未定义的行为。
更新
无需动态分配内存。如果你想先将随机字节放在一个单独的数组中,你可以在堆栈上使用一个字节数组
unsigned char buf[4];
gcry_randomize(buf, sizeof(buf), GCRY_STRONG_RANDOM);