我需要对流进行各种读取以进行解密过程。 (对于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();
答案 0 :(得分: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);