2011-02-07 21 views
0

我試圖實現message.rpmsg格式(這裏:http://msdn.microsoft.com/en-us/library/ee625343(v=EXCHG.80).aspx)的Microsoft規範。規範是zlib壓縮流的奇怪組合,打包在數據包中。對於每個數據包,我需要在數據包頭中放入未壓縮數據流中的字節數(必須是4096,否則Outlook會咳嗽,不管規範如何),壓縮緩衝區的大小以及魔術標記。試圖壓縮zlib格式的低層訪問流

我的代碼是在.net,最好是我正在尋找一個所有託管庫。

縱觀各個庫(SharpZlibLib,zlib.NET,微軟Compression.Deflate命名空間) - 我無法找到一個對公衆開放的條目,對於每個「寫」會做: - 返回壓縮字節 數量 - 擔保字節邊界(FLUSH_SYNC) - 理想情況下,不會僞造或更改代碼

我看過的庫有一個輸出流,您可以從中讀取(整個壓縮流) - 但不提供訪問數據包本身。

現在,我使用原始zlib庫和本地zlib1.dll,在對contrib/dotzlib進行了很多修改之後 - 但是,我想避免當前解決方法的明顯性能和部署麻煩

所以我正在尋找一個庫,讓我指定FLUSH模式,並給我訪問每個數據包的大小。

此外,如果任何人都可以評定各種庫(zlib.net,SharpZipLib似乎是最普遍的 - 別的),以及諸如性能/品質/支持領域

感謝很多 烏里

+0

你提到*閱讀*從流 - 你在這裏壓縮還是解壓縮? – 2011-02-07 11:19:59

回答

0

未經測試,但使用zlib.net我會期望像下面這樣的工作;請注意,我在這裏使用的是MemoryStream以避免必須尋找(因爲不能普遍支持 - 因爲塊長度最大爲4k,所以我根本不在意),但是如果你知道,那麼你可以尋找你可以寫一個假0壓縮的長度,然後寫入數據,然後求向後更新壓縮長度,並再次尋求轉發到最後:

static void WriteBlock(Stream destination, byte[] arr, int offset, int length) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     using (var zlib = new zlib.ZOutputStream(ms)) 
     { 
      zlib.Write(arr, offset, length); 
     } 
     WriteInt32LittleEndian(destination, 0x00000FA0); 
     WriteInt32LittleEndian(destination, length); 
     WriteInt32LittleEndian(destination, (int)ms.Length); 
     destination.Write(ms.GetBuffer(), 0, (int)ms.Length); 

    } 
} 
static void WriteInt32LittleEndian(Stream destination, int value) 
{ 
    destination.WriteByte((byte)value); 
    destination.WriteByte((byte)(value >> 8)); 
    destination.WriteByte((byte)(value >> 16)); 
    destination.WriteByte((byte)(value >> 24)); 
}