2013-04-15 51 views
0

我寫了一個簡單的文本文件壓縮器,使用霍夫曼編碼。我編碼文本並將由Huffman生成的二進制文件寫入文件。爲了解碼,我讀入二進制文件,並通過霍夫曼樹進行。霍夫曼編碼:處理消極的歧義與零

這部分很簡單。問題出現在0和負數之間。對於練習/趣味/學習,我決定做我自己的二進制轉換方法(從Java字節到字符串,反之亦然),並決定通過將最後一位翻轉爲1來表示負數。

例如,-2 = 00000101;; 2 = 00000100(額外的0進行填充,因爲即使是不必要的0的是霍夫曼重要......這是無關緊要的,雖然)

然而,0 = 00000000 = 00000001

這可能似乎不是一個問題,但是這兩個二進制串映射到哈夫曼樹中的兩個不同的字符。

是否有更好的方式處理二進制中的否定,將解決這個問題?

+0

如果有人希望看到代碼:https://github.com/thomas4g/huffman-coding –

回答

0

我不知道這會幫助你,但我會嘗試:

首先,有不同類型的二進制,純或其他人。二元純切勿讓底片,它從0 .......

去您可以使用大小和符號,另一種binnary的,它允許負數,和 - 或+符號表示與數的最重要的位,例如:

0100 = 2

1100 = -2

(1個比特爲標誌,最重要的,第一左: 與4位的數一個,另3個爲數字)

你也可以使用二進制補碼,但這很難,你需要以二進制的形式獲取數字,然後將其轉換爲其他類型。

我希望我能幫助你,在英語比較遺憾的是很多的錯誤!

+0

問題是,要寫這個文件我逐字節地寫。一個字節是8位。所以我需要從編碼的哈夫曼字符串中一次獲取8位二進制塊。 Java中的一個字節持有-128到127,所以我基本上被迫處理負面情況。不過,我想只要將標誌位移到前面就行了,雖然我之前遇到了麻煩。我會試試看。 –

+0

所以雖然前面的符號位更有意義,但它不能解決問題:'10000000 = 0 = 00000000',問題依然存在。 –