2011-11-26 66 views
9

我剛開始學習文件壓縮,並且遇到了一些障礙。我有一個應用程序將編碼字符串,如「程序」作爲壓縮的二進制表示"010100111111011000"(注意這仍然存儲爲字符串)。將位的字符串表示轉換爲字節

Encoding 
g  111 
r  10 
a  110 
p  010 
o  011 
m  00 

現在我需要使用FileOutputStream寫這個文件系統,我遇到的問題是,我怎麼能串「010100111111011000」轉換爲byte[]/byte s到被寫入到文件系統有FileOutputStream

我從來沒有使用位/字節,所以我在這裏死了一個樣。

+0

你說的是「壓縮二進制表示」,然後說你有一個長度爲18個字符的字符串(「010100111111011000」)來表示一個長度爲7個字符的字(「程序」)。你確定你的意思是你在問什麼?通常情況下,您可以將這些位設置爲X個字節(本例中爲3個)。 –

+0

查找'位移運算符':'>>','>>>','<<'。 – Kevin

+0

Brian在翻譯成二進制文件時原始消息大小爲56位,編碼消息僅爲18位。 凱文,人們不斷告訴我,但我仍然無法畫出使用這些操作符之間的鏈接並能夠將其轉換爲字節數組。 –

回答

6

的介紹位移位運算符:

首先,我們有左移操作,x << n。這將在所有由xn左位移位,零填充新位:

 1111 1111 
<< 3: 1111 1000 

接下來,我們已經簽署的右移位運算符,x >> n。這n個移動所有位在x權,複製符號位到新的位:

 1111 1111 
>> 3: 1111 1111 

     1000 0000 
>> 3: 1111 0000 

     0111 1111 
>> 3: 0000 1111 

最後,我們有填零右移位運算符,x >>> n。這種轉變在x所有位右移n位,零填充新位:

 1111 1111 
>>> 3: 0001 1111 

您也可以找到有用的按位或操作,x | y。此位在xy每個位置進行比較,設置上,如果在任一xy是在新的電話號碼的位,否則關:

1010 0101 
| 1010 1010 
    --------- 
    1010 1111 

您應該只需要以前的運營商手頭上的問題,但爲了完整起見,這裏是最後兩個:

按位與操作,x & y設置輸出的比特一個當且僅當該位是在這兩個xy

1010 0101 
& 1010 1010 
    --------- 
    1010 0000 

的按位XOR運算符,x^y設置輸出位之一,如果所述位是在一個數字或另一個,但不是兩者:

1010 0101 
^ 1010 1010 
    --------- 
    0000 1111 

現在,在手施加這些的情況:

您將需要使用位移操作符來添加和操作位。根據字符串表示開始在右側設置位並將其移位。繼續下去,直到達到一個字節的末尾,然後移至下一個字節。假設我們想要創建「1100 1010」的字節表示:

Our byte Target 
--------- -------- 
0000 0000 
      1100 1010 
0000 0001 ^
      1100 1010 
0000 0011 ^
      1100 1010 
0000 0110 ^
      1100 1010 
0000 1100 ^
      1100 1010 
0001 1001  ^
      1100 1010 
0011 0010  ^
      1100 1010 
0110 0101  ^
      1100 1010 
1100 1010   ^

當然,我會將它應用於您的工作。

+0

有一個問題,開始我的字節爲0000 0001,這與寫入字節b = 1相同; ?由於字節的簽名性質,我不確定如何知道二進制表示是什麼,因爲我不知道代表符號的位是什麼。 –

+0

你可以這樣做,但爲了保持一致性,你需要從零字節開始,然後輸入'for'或'while'循環。我會稍微編輯一下這個例子,看看我能否讓這個更清楚些。 – Kevin

0

我想,你想寫這些零和一個二進制值在文件中。我是這樣的,你可以每次迭代8個符號的字符串(String.substring()或者smth),並用Byte(String)構造函數創建字節。 這是我現在想到的最簡單的解決方案。

如果我對這個問題不太正確,請告訴我有關它的更多信息。

+0

我試過這個,字節(字符串)構造函數將採取一個字符串「0011」和字面解釋爲十進制數字11. –

+0

這就是爲什麼你應該你字節(String s,int radix)構造函數來設置二進制基數。 –

1

將您的String切成長度爲8並致電Byte#parseByte。如果您將radix設置爲2,它會將String解析爲二進制數。

+1

線程「main」中的異常java.lang.NumberFormatException:值超出範圍。值:「10000000」基數:2 它只能工作在長度爲7的情況下,除非有前導零,任何想法? –

+0

@John Lotacs我不知道它爲什麼這樣做,但可以使用['Integer#parseInt'](http://tinyurl.com/7uo6b5t)並將其轉換爲'byte'作爲解決方法。 – Jeffrey

+0

@jeff這樣做是因爲'byte'是有符號的,所以它需要是'-111 1111'到'+111 1111'(-128到+127)。一個位數爲1000 0000的字節實際上是-128,並且必須以「-1000 0000」的形式輸入到解析器。 – Kevin