将字符串表示形式转换为字节

时间:2011-11-26 00:43:35

标签: java byte bit-manipulation bits huffman-code

我刚刚开始学习文件压缩,我遇到了一些障碍。我有一个应用程序,将一个字符串,如“程序”编码为压缩二进制表示"010100111111011000"(请注意,它仍然存储为字符串)。

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

现在我需要使用FileOutputStream将其写入文件系统,我遇到的问题是,如何将字符串“010100111111011000”转换为byte[] / {{1}用byte写入文件系统?

我之前从未使用过位/字节,所以我在这里处于死路。

3 个答案:

答案 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很有用。这会比较xy中每个位置的位,如果xy中的位数已开启,则设置新数字的位,否则为:

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

你应该只需要以前的操作员来解决问题,但为了完整起见,这是最后两个:

按位运算符x & y将输出中的位设置为1,当且仅当该位在xy中都处于打开状态时:

  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)构造函数创建字节。 这是我现在想到的最简单的解决方案。

如果我对这个问题不对,请详细说明。