4

我需要對流進行各種解讀以進行解密過程。 (對於WinRT項目)首先,我想要做一個ReadByte()來獲取流的第一個字節。在此之後,我想將幾​​個字節讀入一個數組,然後將剩餘的字節讀入緩衝區。與.AsInputStream()轉換的流一起使用時出現C#DataReader問題

我打開了一個DataReader對傳遞的IInputStream對象。後者又是使用.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

你也可以說創造了第一個代碼「streamToDecrypt」?它是一個文件,httpstream等? – Jon

+0

爲你增加了一個更新Jon。 –

回答

3

你需要調用datareader.LoadAsync(大小),閱讀它之前將文件加載到緩衝區。

您解密方法更改爲這樣的事情:

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); 
相關問題