【问题标题】:Generating a 160bit string which is stored in an array生成存储在数组中的 160 位字符串
【发布时间】:2009-11-13 00:00:07
【问题描述】:

我正在尝试生成一个随机的 160 位字符串,该字符串应该存储在名为 str[20] 的字符数组中。很明显,该数组包含 20 个字符。如何将 160 位更改为 20 个字符/数字?我正在尝试在 C 中做到这一点。非常感谢任何帮助,因为我已经没有想法了,然后我大学的帮助台不会帮助我。..

【问题讨论】:

  • 一个字节有多少位? C语言中20个字符的数组有多少字节?
  • 假设 char 在您的机器上是 8 位类型,则该数组已准备好容纳 160 位。这 160 位现在是什么格式的?
  • 您是如何生成这些位的?你能给我们看一些代码吗?
  • 一个字节中的 8 位。 20 字节 = 160 位。问题是如何将每个 8 位数字存储在包含 20 个字节的数组中??
  • for (i = 0; i

标签: c random bits


【解决方案1】:

这看起来像功课,所以我只给你基本的:

您的变量将如下所示:

char str[20];

请注意,此数组将保存 字节的数据,不一定是“字符”(字母、数字和标点符号,因为我们通常理解单词字符“)。

除非分配是关于编写自己的随机生成器,否则您可能想要使用 C 的运行时伪随机生成器(在 stdlib.h 中),并使用它的两个函数:srand()rand()srand() 用于“播种”生成器(具有相同值以获得可重复性的种子,在调试期间很有用,或者使用可变数(通常与系统时间相关)以获得真正的随机数。rand() 用于产生整数随机值。

因为 rand() 产生一个介于 0 和 RAND_MAX 之间的值(这是一个“大”数),您可能需要使用模数来获得正确的数量。例如

str[0] = char(rand() % 256); // 或类似的东西。

rand() 但是不会产生 20 字节的整数,因此您需要获取多个 rand 值并将它们适当地放入数组中。最直接的可能是调用 rand 20 次,每次存储 1 个字节,但也可以一次存储多个字节,使用指向部分 str 的指针。

【讨论】:

    【解决方案2】:

    160 位是 20 个字节,因此可以容纳 20 个字符串字符。

    如果 N 是一个包含所有位的数字,则可以编写如下循环:

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

    编辑: C 确实没有可以连续保存所有位的数据类型。因此,您需要为每个包含您的部分位的变量将循环拆分为几个子循环。

    另一方面,如果您在运行中一次生成一个位,则代码可能如下所示(假设您的随机函数称为“random()”并返回一个 0 或 1 的 int )

    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;
    }
    

    【讨论】:

    • 有我不知道的160位类型吗?
    • 呵呵,真的..好的,第二个例子更现实:)
    【解决方案3】:

    一个随机的可打印字符串。如果您不在乎它是否可打印,请删除对 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多