java - 将位的字符串表示形式转换为字节

标签 java byte bit-manipulation bit huffman-code

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

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

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

我以前从未使用过位/字节,所以我有点陷入了死胡同。

最佳答案

位移运算符简介:

首先,我们有左移运算符,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当且仅当位在 x 中都打开时,将输出中的位设置为 1和 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           ^

当然,我会把它应用到您的工作中。

关于java - 将位的字符串表示形式转换为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275474/

相关文章:

java - 删除文本文件中的空格

java - 反向读写锁

c++ - C/C++ 位玩弄

c++ - 编辑存储在字节数组中的数据

objective-c - 是否有特定的objective-c 方法来计算整数中的位数

c++ - 将 8 位值掩码为 32 位值

Java网站解析器

java - 使用 hbm 实现 Hibernate 一对多延迟加载

java - 解码十六进制字符串

java - 使用十六进制数初始化无符号字节数组