【问题标题】:WinRT - Read from IInputStream one byte at a time until a specific byte encounteredWinRT - 一次从 IInputStream 读取一个字节,直到遇到特定字节
【发布时间】:2012-11-29 18:27:54
【问题描述】:

我有一个IInputStream,我想从中读取数据,直到遇到某个字节,此时我会将IInputStream 传递给其他对象以消耗流的其余部分。

这是我想出的:

public async Task HandleInputStream(IInputStream instream)
{
    using (var dataReader = new DataReader(instream))
    {
        byte b;
        do
        {
            await dataReader.LoadAsync(1);
            b = dataReader.ReadByte();

            // Do something with the byte
        } while (b != <some condition>);

        dataReader.DetachStream();
    }
}

似乎每次运行LoadData 一个字节会非常慢。我的困境是,如果我选择一个缓冲区大小(如 1024)并加载它,并且我的值显示为 10 个字节,那么此方法将具有下一个 1014 个字节的数据,并且必须将其传递给下一个方法进行处理.

有没有更好的方法来解决这个问题,或者这是一个可以接受的解决方案?

【问题讨论】:

    标签: c# windows-runtime


    【解决方案1】:

    如果您要查找的值距离流的开头不是太远,那么这种读取应该不会那么慢。您期望它在流中有多远?你测试过性能吗?

    根据您使用的流类型,您也许可以使用其他方法:

    • 如果它支持向后搜索(例如,您正在从文件中读取),您可以一次读取更大的块,只要您知道在什么偏移处找到了您的值。然后,您可以在交出之前在流中搜索到该位置。
    • 如果这不可能,您可以创建另一个中间内存流,将已读取的缓冲区的剩余部分复制到其中,然后复制流的其余部分。即使您无法向后寻找,这也有效。如果流太大,唯一的问题可能是内存消耗。

    【讨论】:

    • 我还没有测试过性能。它不应该超过几百个字节 - 所以我认为这也可以。当我写它时,它只是向我提出了一个危险信号。
    • 流来自一个套接字,所以你不能真正寻找它。
    • 我已经做了一些测试,它似乎工作正常。我现在将使用这种方法。感谢您的第二意见!
    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多