我需要对流进行各种读取以进行解密过程。 (对于 WinRT 项目)首先,我想做一个 ReadByte() 来获取流的第一个字节。之后我想将几个字节读入数组,然后将其余字节读入缓冲区。

我在传递的 IInputStream 对象上打开一个 DataReader。反过来,它是使用 .AsInputStream() 方法从 System.IO.Stream 对象创建的。当我在调试期间查看 DataReader 对象时,我看到 UnconsumedBufferLength 为 0,并且我无法执行 ReadByte() 或 ReadBytes() 以免我想要获得“操作试图访问有效范围之外的数据”异常。

为什么 DataReader 对象看起来是空的?我之前遇到过 AsInputStream() 方法没有返回实际 IInputStream 的问题。我如何最终在 System.IO.Stream 对象上打开 DataReader 对象。

分配 DataReader 的代码:

private Stream DecryptStream(IInputStream streamToDecrypt, byte[] key)
    {
        try
        {
            var dataReader = new DataReader(streamToDecrypt);

            int ivLength = dataReader.ReadByte();  //Throws exception (UnconsumedBufferLength = 0 remember)

            byte[] iv = new byte[ivLength];
            dataReader.ReadBytes(iv);   //Throws exception (UnconsumedBufferLength = 0 remember)


            IBuffer toDecryptBuffer = new Windows.Storage.Streams.Buffer(dataReader.UnconsumedBufferLength);
            toDecryptBuffer = dataReader.ReadBuffer(dataReader.UnconsumedBufferLength);   //Works, but only because toDecryptBuffer is of length 0. which is still useless.

调用上述方法的代码:
Stream plainStream = DecryptStream(streamToDecrypt.AsInputStream(),key);

更新:创建流 的代码
这是第一次从 System.IO.Compression.ZipArchive 对象创建流的地方。然后将其作为“streamToDecrypt”传递给临时解密函数
ZipArchiveEntry metaEntry = archive.Entries.Where(x => x.FullName == "myFullNameHere").FirstOrDefault();
Stream returnStream = metaEntry.Open();

最佳答案

在读取文件之前,您需要调用 datareader.LoadAsync(size) 将文件加载到缓冲区中。

将您的解密方法更改为如下所示:

private async Task<Stream> DecryptStream(IInputStream streamToDecrypt, byte[] key, int uncompressedSize)
{
    try
    {
        var dataReader = new DataReader(streamToDecrypt);
        await datareader.LoadAsync(uncompressedSize);

        int ivLength = dataReader.ReadByte();  //Throws exception (UnconsumedBufferLength = 0 remember)

        byte[] iv = new byte[ivLength];
        dataReader.ReadBytes(iv);   //Throws exception (UnconsumedBufferLength = 0 remember)

然后当你调用它时,从 ZipArchiveEntry 传入未压缩的大小:
await DecryptStream(streamToDecrypt.AsInputStream(),key, streamToDecrypt.Length);

关于与 .AsInputStream() 转换流一起使用时的 C# DataReader 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24452319/

10-12 15:49