如何将一个以“0”开头的String数据转为byte类型,并且恢复的时候不丢失原来的“0”?

问题描述 投票:0回答:1

最近在学习哈夫曼树和Java代码。当我尝试对字符串二进制文件进行编码时,出现了一个严重的问题。我会一步步解释。

1,这些是我要编码的原始单词:

String words = "aa bbb cccc";

2、霍夫曼码的图,它们不是真正的码。我正在尝试编写一些代码,以便我可以尽快向您展示问题;

a:1110 0110 (ignore the space, I deliberately added it for human readability)
b:0001 1001
c:011

3、我将二进制字符串转为字节数组。

byte[] arr = {-20,31,3}

4、解码。我用 256(1,1111,1111) 通过按位或来计算每个字节,以便取回 0。然后我使用子字符串(..)。

        for(int i = 0; i < bytes.length; i++){
            boolean isLast = i == bytes.length - 1;
            String byteToString = byteToString(isLast, bytes[i]);
            System.out.println(byteToString + " ");
        }
    

   public static String byteToString(boolean isLast,byte b){
        int temp = b;
        if(!isLast){
            temp = 256 | temp;  //temp = 256 | -20;(256 | 31)
        }
        
        String stringDecode = Integer.toBinaryString(temp);
        if(!isLast){
            return stringDecode.substring(stringDecode.length() - 8);
        }else{
            return stringDecode;
        }

    }

结果:

11101100
00011111
11   // the 0 is missing.

我试图做“temp = 256 | 3”,但我得到“00000011”。它有太多0。 我不知道我是否表达清楚了。 如果有人能帮我一个忙,我将非常感激。谢谢你。

java algorithm huffman-code huffman-tree
1个回答
0
投票

您甚至没有正确考虑霍夫曼代码,因此您的Java代码和您的问题无关。

每个代码都有一个位数,然后是这些位。这意味着您应该

c
作为三位。您需要将这些位作为“该位数”放入输出流中,以实现压缩。将一个代码编码为一个字节是没有意义的,特别是如果您最终得到的代码长度超过八位。 这是通过位运算、移位和或正确完成的。您将一串位流构建成一个字,当字缓冲区中至少有八位时,您就写出该一个字节。最后,写出最后一个字节中的所有剩余位。

然后在另一端,您以字节为单位读取,使用移位和或在字中构建位流,然后使用移位和与操作从流中提取位以根据需要解码霍夫曼代码。

© www.soinside.com 2019 - 2024. All rights reserved.