2013-11-20 31 views
0

我的程序發送從C#壓縮數據到Java。在C#中,壓縮數據從DotNetZip的Ionic.Zlib.GZipStream.CompressBuffer方法返回爲byte []。該字節[]用於構造從C#發送的MemoryStream。發送從C#的無符號字節,再次接收符號字節在Java中

在Java中,流由GZIPInputStream.read方法使用,並寫入另一個字節[],最終用於重建原始未壓縮數據(現在爲文本,但最終會成爲圖像)。在我的測試中,我發現對於包含非常大數字的數據集,我沒有獲取所有數據,這使我瞭解了已簽名類型和未簽名類型之間的區別。從我的谷歌搜索每個人似乎都建議轉換爲在Java端詮釋,這樣的信息可以被正確檢索,但據我所知,是使用一個int []在GZIPInputStream合適流的建設沒有這樣的方式。我試圖(愚蠢)在C#中將字節轉換爲sbyte,但MemoryStream不需要sbyte []來構建。

我該怎麼辦?看來我是S.O.L.我正在積極研究這個,但我想我也會問Stack。

作爲參考,這裏是從我有關同一個項目的早期帖子。我設法通過在該職位的問題要解決:Sending gzipped data over a network from C# to Java

編輯:爲了澄清,我提到,數據僅僅是文字,但它沒有工作了非常大的數字。這些數字由C#從Access讀取(數字字段爲文本字段),作爲二進制壓縮數據發送,然後在Java中重構爲文本。

回答

1

你能幫助澄清。你提到原始的,未壓縮的數據是文本(現在),但後來你提到它不適用於非常大的數字。沒有更多的上下文,很難提供幫助。

我認爲這將是值得多看基本數據類型,看看你的其他問題,我認爲這是讓你感到困惑的事情。

字節是二進制數據的基本貨幣單位。它是8位,可以有256個不同的值......幾乎所有處理二進制數據的函數都會處理bytes [](例如gzip compress或uncompress)。

char是單個文本字符。在java和c#中,它是兩個字節,它代表一個unicode字符 - 基本上每個字母表中的字母都是可以想到的(在U + 0000到U + FFFF範圍內)。

如果你想寫一個字符串到一個二進制文件(壓縮它或通過網絡),你需要選擇如何編碼該字符串。仔細查看一下關於字符串編碼的一些信息。 http://www.joelonsoftware.com/articles/Unicode.html。你的其他代碼示例掩蓋了一些細節,但我認爲這是值得明確的,這將有助於澄清你的理解。

最後,int在兩種語言中都是4個字節(或32位),但這些字節的順序又是一個選擇(endian)。

希望有幫助。

+0

是的,這有很大幫助。謝謝。我正在尋找你發佈的鏈接,我也編輯了我的原始帖子,以澄清我的意思。 – Fam

相關問題