9

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

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

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

我以前从未使用过比特/字节,所以我在这里有点死胡同。

4

3 回答 3

6

移位运算符简介:

首先,我们有左移运算符,x << n。这将左移所有xn,用零填充新位:

      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 | yx这将比较和中每个位置y的位,如果新数字的位在x或中打开,则将其设置为打开y,否则关闭:

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

对于手头的问题,您应该只需要前面的运算符,但为了完整起见,这里是最后两个:

按位与运算符x & y将输出中的位设置为 1,当且仅当该位在x和中都打开y

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

按位异或运算符,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           ^

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

于 2011-11-26T02:18:47.067 回答
1

把你String切成长度8并调用Byte#parseByte。如果将 设置radix2,它会将 解析String为二进制数。

于 2011-11-26T01:40:29.673 回答
0

我猜,您想将这些零和一作为二进制值写入文件中。我是这样的,您可以每次都迭代带有 8 个符号的字符串(String.substring() 或 smth),并使用 Byte(String) 构造函数创建字节。这是我现在想到的最简单的解决方案。

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

于 2011-11-26T01:03:26.663 回答