【问题标题】:Generate random int using random byte generator使用随机字节生成器生成随机 int
【发布时间】:2014-05-21 05:04:06
【问题描述】:

我正在使用随机生成器,它将随机字节的长度作为输入并返回字节数组。我现在需要的是将该字节数组转换为 8 位整数,然后再转换为字符串。

byte[] randomData = this.GetRandomArray(4);
SecretCode = Math.Abs(BitConverter.ToInt32(randomData, 0)).ToString().Substring(0, 7);

但有时 int 小于 8 位,我的方法会失败。如何确保生成的字节数组可以转换为 8 位整数?

【问题讨论】:

  • 我会对 MSB 字节设置一些限制,例如一个最小值,以便生成的整数足够大(8 位或更多)。作为替代方案,当您所拥有的不满足该标准时,您可以生成一个新数字。

标签: c#


【解决方案1】:

另一种选择:

myString = BitConverter.ToUInt32(randomData, 0).toString("D8");

注意 - using ToUInt32 是一种比转换为有符号整数并获取绝对值更明智的方法(它还会使您可以生成的值的数量增加一倍,因为 -123123 将导致不同的字符串输出,如果您使用Math.Abs,他们不会。); "D8" 格式应转换为包括前导零在内的八位数字。

https://stackoverflow.com/a/5418425/1967396

【讨论】:

    【解决方案2】:

    在尝试获取 Substring() 之前,您需要连接八个零,然后获取最后 8 个字符。

    StringBuffer s = new StringBuffer("00000000").append(Math.Abs(BitConverter.ToInt32(randomData, 0)).ToString());
    SecretCode = s.substring(s.length()-7);
    

    您的另一个选择是使用格式化程序来确保位的字符串化返回前导零。

    【讨论】:

      【解决方案3】:

      您确定您的方法在 Substring 上失败了吗?据我所知,有很多问题:

      1. 如果没有返回 4 个字节,它将失败(BitConverter.ToInt32 上的 ArgumentException)
      2. 如果字符串不够长,它会失败(你的问题来自上面)
      3. 它会根据需要截断为七个字符,而不是八个字符。

      您可以使用PadLeft 函数来填充零。如果想要八个,则代码应如下所示:

      var s = Math.Abs(
                 BitConverter.ToInt32(randomData, 0))
                     .ToString()
                     .PadLeft(8, '0')
                     .Substring(0, 8);
      

      对于七个,将8 替换为7

      【讨论】:

        【解决方案4】:

        你可以使用<stringCode>.PadLeft(8, "0")

        【讨论】:

          猜你喜欢
          • 2015-03-14
          • 1970-01-01
          • 2023-01-03
          • 1970-01-01
          • 2016-02-20
          • 2012-03-10
          • 1970-01-01
          • 2017-09-03
          • 2017-12-06
          相关资源
          最近更新 更多