【问题标题】:Creating a 'ChaosStream' out of a C# MemoryStream for reading random lengths of data?从 C# MemoryStream 中创建“ChaosStream”以读取随机长度的数据?
【发布时间】:2013-08-01 19:42:28
【问题描述】:

测试审查表明MemoryStream 总是返回“平滑”的结果。即,如果我们从MemoryStream 将 200 个字节读取到一个 400 字节的工作缓冲区中,它总是会在一次调用中准确返回 200 个字节。如果我们将 4000 字节读入 200 字节的工作缓冲区,它总是正好 20 次迭代,每次正好 200 字节。

问题是MemoryStream 可以(在现实世界中,极端情况下)代表慢流源(如网络或文件)。因此,读取可能不会如此确定地平滑。有可能每个Read 操作都可能返回一个不确定的读取的字节数(例如:8、1、105、20、5、80 ...)

那么有什么好方法可以将原版MemoryStream 变成(因为缺少更好的词)ChaosStream,其中读取的字节数是介于 1 和读取请求 count 之间的随机数? (请注意,0 表示流结束)。字节本身需要是底层字节,只需对它们进行一些随机/抖动读取以扩大测试范围。

【问题讨论】:

    标签: c# stream


    【解决方案1】:

    您总是可以从 MemoryStream 派生以提供一些随机性:

    public class ChaosStream : MemoryStream
    {
        private Random random = new Random();
    
        // Create constructors as needed to match desired MemoryStream construction
    
        public override int Read(byte[] buffer, int offset, int count)
        {
            int newCount = random.Next(1, count + 1);
            return base.Read(buffer, offset, newCount);
        }
    }
    

    【讨论】:

    • 使用这种Random 用法,请注意一次创建多个ChaosStream:它们可能共享一个种子。这对您来说可能是也可能不是问题。
    • @TimS 好点。如果这是一个问题,您可以创建一个静态的 Random 实例(或用于播种其他实例的实例),但这需要同步。鉴于用例(测试),我怀疑一次一个流将是最常见的用法,但如果这不是真的,那么这可能是一个问题。
    • 更好地包装流以支持组合而不是继承。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多