使用.AsInputStream()转换流时,C# DataReader存在问题

4

我需要在解密过程中对流进行各种读取操作。(针对WinRT项目)首先,我想通过ReadByte()方法获取流的第一个字节。之后,我想将几个字节读入数组中,然后将其余的字节读入缓冲区。

我在传递的IInputStream对象上打开一个DataReader。这个对象是使用.AsInputStream()方法从System.IO.Stream对象创建的。当我在调试期间查看DataReader对象时,发现UnconsumedBufferLength为0,我不能使用ReadByte()或ReadBytes(),否则会收到“The operation attempted to access data outside the valid range”异常。

为什么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();

你能展示一下创建第一个“streamToDecrypt”的代码吗?它是文件、http流等等? - Jon
给你更新了,Jon。 - nico van vuuren
1个回答

3

在读取文件之前,您需要调用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接