【问题标题】:Generate a Precise Amount of Random Data in C#在 C# 中生成精确数量的随机数据
【发布时间】:2012-09-18 01:20:06
【问题描述】:

我需要一种方法来生成精确数量的伪随机(字符串)数据。例如,我想编写一个方法,该方法接受要生成的字节数的参数并返回该精确大小的字符串。

我原本打算简单地为每个字节生成 1 个字符,但显然字符不再都是一个字节了。

感谢任何帮助!

【问题讨论】:

  • 测量现有字符串以确定精确的字节数 - 再说一遍,它不再是所有字节了。
  • 字符串根本不包含字节,而是字符。一个字符在内存中使用两个字节,但我认为这不是你所追求的。您也可以将字符串编码为字节,但长度因使用的编码而异。获取(以某种方式)对应于多个字节的字符串的目的是什么?你打算怎么用?
  • 这里数据和文本的关系似乎有点模糊。字符串是最终结果还是获取字节的手段?
  • 好的,您对字符数或字节数有大小要求吗?
  • 需要以字节为单位的精确大小 - 现在你自相矛盾了。字符串包含字符而不是字节。 sizeof(char) == 2 * sizeof(byte)

标签: c# string random byte


【解决方案1】:

如果您使用有限的字符集,您可以选择那些以单字节码结尾的字符,而不管使用何种编码。

public byte[] CreateFiller(int length, Random rnd) {
  string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  return Encoding.UTF8.GetBytes(Enumerable.Range(0, length).Select(i => chars[rnd.Next(chars.Length)]).ToArray());
}

// only use the overload that creates a Random object itself if you use it once, not in a loop
public byte[] CreateFiller(int length) {
  return CreateFiller(length, new Random());
}

【讨论】:

    【解决方案2】:

    我建议使用RNGCryptoServiceProvider,它可以生成任意数量的随机字节。然后您可以将其转换为字符串(例如使用 byte64 编码或其他方法)。

    记得在文件中添加using System.Security.Cryptography;

    public class RandomService : IDisposable
    {
        private readonly RNGCryptoServiceProvider rngCsp;
    
        public CryptoService()
        {
            rngCsp = new RNGCryptoServiceProvider();            
        }
    
        public byte[] GetRandomBytes(int length)
        {
            var bytes = new byte[length];
            rngCsp.GetBytes(bytes);
            return bytes;
        }
    
        public string GetRandomString(int length)
        {
            var numberOfBytesForBase64 = (int) Math.Ceiling((length*3)/4.0);
            string base64String = Convert.ToBase64String(GetRandomBytes(numberOfBytesForBase64)).Substring(0, length); //might be longer because of padding            
            return base64String.Replace('+', '_').Replace('/', '-'); //we don't like these base64 characters
        }
    
        public void Dispose()
        {
            rngCsp.Dispose();
        }
    }
    

    【讨论】:

    • 转成字符串后大小不变吗?
    • 每个字节大约有 8/6 个字符。
    • @Razick:base 64 比初始字节数组长。检查我的更新 - 我已经给出了示例代码。
    • 谢谢,我试试看。
    • RNG 非常随机,但对于创建一些测试数据来说也可能是严重的过度杀伤力。如果您需要大量数据,这甚至是一个问题。 `Random.NextBytes()' 可能也能正常工作。
    【解决方案3】:
    char[] UsableChars = { 'a', 'b', 'c', '1', ...., `☺` };
    Random r = new Random();
    
    int wantedSize = 12;
    
    string s = new string (Enumerable.Range(0, wantedSize)
        .Select((i) =>  UsableChars[r.Next(UsableChars.Length)]).ToArray());
    

    【讨论】:

      【解决方案4】:

      您可能会参加 Random 课程,转换为 byte[] 然后 ToString()

      【讨论】:

      • 虽然每个string 都可以转换为byte[],但并不是每个byte[] 都可以转换为字符串。
      • @dtb: 每个字节[] 都可以转换为字符串(例如 base64 或一些任意翻译)。
      • 但正如名字所说,它只使用了 64 个不同的字符。在 Unicode 的世界里还有更多的东西。
      • 64 个可能的字符实际上就可以了。
      猜你喜欢
      • 2014-06-08
      • 2011-02-11
      • 2013-08-10
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      相关资源
      最近更新 更多