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

Joh*_*acs 9 java byte bits bit-manipulation huffman-code

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

Encoding
g       111
r       10
a       110
p       010
o       011
m       00
Run Code Online (Sandbox Code Playgroud)

现在我需要使用a将此写入文件系统FileOutputStream,我遇到的问题是,如何将字符串"010100111111011000"转换为要写入文件系统的byte[]/ bytes FileOutputStream

我之前从未使用过bit/bytes,所以我在这里处于死路.

Kev*_*vin 6

位移运算符介绍:

首先,我们有左移算子x << n.这将在所有位移位x由左n位,零填充新位:

      1111 1111 
<< 3: 1111 1000
Run Code Online (Sandbox Code Playgroud)

接下来,我们有签名的右移运算符x >> n.这会将所有位x右移n,将符号位复制到新位:

      1111 1111 
>> 3: 1111 1111

      1000 0000
>> 3: 1111 0000

      0111 1111 
>> 3: 0000 1111
Run Code Online (Sandbox Code Playgroud)

最后,我们有零填充右移运算符x >>> n.这改变所有位x右移n位,零填充新位:

       1111 1111 
>>> 3: 0001 1111
Run Code Online (Sandbox Code Playgroud)

你也可以找到有用的bitwise或运算符x | y.该位在每个位置进行比较xy,设置,如果它是在无论是在新号码的位xy,否则关闭:

  1010 0101
| 1010 1010
  ---------
  1010 1111
Run Code Online (Sandbox Code Playgroud)

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

按位和操作员,x & y设置在输出端上的比特给一个当且仅当该位是在两个xy:

  1010 0101
& 1010 1010
  ---------
  1010 0000
Run Code Online (Sandbox Code Playgroud)

bitwise-xor运算符,x ^ y如果该位在一个数字或另一个数字中打开,则将输出位设置为1,但不是两个:

  1010 0101
^ 1010 1010
  ---------
  0000 1111
Run Code Online (Sandbox Code Playgroud)

现在,将这些应用于手头的情况:

您将需要使用位移运算符来添加和操作位.根据字符串表示开始在右侧设置位并将其移位.继续,直到您到达一个字节的末尾,然后移动到下一个字节.假设我们要创建"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           ^
Run Code Online (Sandbox Code Playgroud)

当然,我会留给你将它应用到你的工作中.