我刚刚开始学习文件压缩,我遇到了一些障碍。我有一个应用程序,将一个字符串,如“程序”编码为压缩二进制表示"010100111111011000"
(请注意,它仍然存储为字符串)。
Encoding
g 111
r 10
a 110
p 010
o 011
m 00
现在我需要使用FileOutputStream
将其写入文件系统,我遇到的问题是,如何将字符串“010100111111011000”转换为byte[]
/ {{1}用byte
写入文件系统?
我之前从未使用过位/字节,所以我在这里处于死路。
答案 0 :(得分:6)
对位移运算符的介绍:
首先,我们有左移运算符x << n
。这会将x
中的所有位移位n
位,将新位填充为零:
1111 1111
<< 3: 1111 1000
接下来,我们有了签名的右移运营商x >> n
。这会将x
中的所有位右移n,将符号位复制到新位:
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
很有用。这会比较x
和y
中每个位置的位,如果x
或y
中的位数已开启,则设置新数字的位,否则为:
1010 0101
| 1010 1010
---------
1010 1111
你应该只需要以前的操作员来解决问题,但为了完整起见,这是最后两个:
按位运算符x & y
将输出中的位设置为1,当且仅当该位在x
和y
中都处于打开状态时:
1010 0101
& 1010 1010
---------
1010 0000
bitwise-xor运算符x ^ y
将输出位设置为1,如果该位在一个数字或另一个数字中打开,但不是两者都是:
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 ^
我当然会留给你将它应用到你的工作中。
答案 1 :(得分:1)
将String
缩短为8
,并致电Byte#parseByte。如果您将radix
设置为2
,则会将String
解析为二进制数。
答案 2 :(得分:0)
我想,你想把这些0和1作为二进制值写在文件中。我是这样,你可以每次迭代8个符号的字符串(String.substring()或smth)并用Byte(String)构造函数创建字节。 这是我现在想到的最简单的解决方案。
如果我对这个问题不对,请详细说明。