Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 1'的分裂序列;s和0';s转换为字节_Java_File_Compression_Huffman Code - Fatal编程技术网

Java 1'的分裂序列;s和0';s转换为字节

Java 1'的分裂序列;s和0';s转换为字节,java,file,compression,huffman-code,Java,File,Compression,Huffman Code,我目前正在进行哈夫曼解码。我有一个字符串表示所有字符编码(即“1101000000000001”)。我试图将其分成8组,并返回其相应的值(即“11010001”将返回209)。但是,它似乎不适用于较小的文件。下面是我的代码。提前感谢您的帮助 for(char bit : textbytes.toCharArray()) { if(bit == '1') { target

我目前正在进行哈夫曼解码。我有一个
字符串
表示所有字符编码(即“1101000000000001”)。我试图将其分成8组,并返回其相应的值(即“11010001”将返回209)。但是,它似乎不适用于较小的文件。下面是我的代码。提前感谢您的帮助

for(char bit : textbytes.toCharArray())
            {
                if(bit == '1')
                {
                    target |= 1 << bitCount;
                }
                bitCount++;
                if(bitCount >= 8)
                {
                    bitCount = 0;
                    bits.add(target);
                    target = 0;
                }
            }
            byte[] bitstring = new byte[bits.size()];
            for(int i = 0; i < bits.size(); i ++)
            {
                bitstring[i] = bits.get(i);
                compressedFile.write(bitstring[i]);
            }
for(字符位:textbytes.toCharArray())
{
如果(位=='1')
{
目标|=1=8)
{
比特数=0;
位。添加(目标);
目标=0;
}
}
byte[]bitstring=新字节[bits.size()];
对于(int i=0;i

另外,我从互联网上获取了一些部分,因此我不完全理解它(例如
target |=1听起来你还没有尝试进行哈夫曼编码,只需将
0
1
的“二进制”
String
S转换为Java整数类型即可。尝试以下方法:

public static long decode(String textbytes) {
    long result=0;

    for(char ch : textbytes.toCharArray()) {
        result = result << 1;
        if(ch == '1')
            result = result + 1;
    }

    return result;
}
公共静态长解码(字符串textbytes){
长结果=0;
for(char ch:textbytes.toCharArray()){
结果=结果209)

方法非常简单:

  • result=0开始
  • 对于输入字符串中的每个字符,向左移动
    result
    1位,为当前字符表示的位“腾出空间”。然后,如果当前字符表示
    1
    位,则添加
    1
    以生成结果

  • 此外,该代码假定您没有得到超过64位的位字符串,您可能需要检查其健壮性。

    我会以不同的方式进行操作

        byte[] bytes = new BigInteger("1101000100000001", 2).toByteArray();
        for (byte b : bytes) {
             compressedFile.write(b);
        }
    

    任何特定的语言偏好?我认为你应该用0shmm填充它。它似乎也不适用于较小的文件,即使有8个以上的1和0。如果我使用FileInputStream read()方法读取字节,那么不管有多少位,它仍然会吗?我知道read()方法读取一个字节的数据,所以如果“1101000000000001”是完全编码而不被分解的,它会影响read()的工作方式吗?因为我存储数据的方式(在
    长的
    中),此方法最多只能处理64位。如果以不同的方式存储数据,例如,在本线程的另一个答案中,将数据存储在
    biginger
    中,则此方法将处理尽可能多的位(当然,内存允许)。只要您确定要读取的唯一字符是
    '1'
    '0'
    ,以字符或字节读取就没有区别。