我需要在解密过程中对流进行各种读取操作。(针对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();