我正在尝试使用Java实现算术编码,我找到了这个项目:Reference-arithmetic-coding。但它的'输入和输出都是文件,我想得到的字节数是AdaptiveArithmeticCompress.compress()
的编码结果。这是我做的:
我在名为AdaptiveArithmeticCompress
的课程AACompress
中添加了一个函数:
public static byte[] AACompress(short[] delta) throws IOException{
byte[] bytedelta = TypeConversion.ShortToByte_little(delta);
ByteArrayInputStream bis = new ByteArrayInputStream(bytedelta);
BitOutputStream out = new BitOutputStream(new ByteArrayOutputStream());
compress(bis,out);
return out.toBytearray();
}
并创建out.toBytearray()
以将outputstream转换为字节数组。
public byte[] toBytearray() {
ByteArrayOutputStream baos = (ByteArrayOutputStream) output;
return baos.toByteArray();
}
但是当我将结果字节数组与AdaptiveArithmeticCompress.compress(InputStream in, BitOutputStream out)
的输出结果文件进行比较时,我发现
short[] delta = ...;
byte[] coding = AdaptiveArithmeticCompress.AACompress(delta);
coding.length
比out.buf.length
少1,out.buf
的最后一个字节丢失,因此编码结果错误。
我是Java的新手,这个问题让我困惑了好几天。谁能帮我?非常感谢。
答案 0 :(得分:0)
我通过在close
类
ArithmeticEncoder
方法解决了这个问题
public void close() throws IOException {
output.close();
}
丢失的字节已添加到outputstream中。