/** * Construct a Canonical Huffman Codec for Byte data * * @param coreBlockInputStream the input bitstream to read from * @param coreBlockOutputStream the output bitstream to write to * @param values the alphabet (provided as Integers) * @param bitLengths the number of bits of symbol's huffman code */ public CanonicalHuffmanByteCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, final byte[] values, final int[] bitLengths) { super(coreBlockInputStream, coreBlockOutputStream); helper = new HuffmanByteHelper(values, bitLengths); }
@Override public Byte read() { return helper.read(coreBlockInputStream); }
@Override public void write(final Byte value) { helper.write(coreBlockOutputStream, value); }
HuffmanByteHelper helper = new HuffmanByteHelper(cal.valuesAsBytes(), cal.bitLens()); helper.write(bos, b); for (int i = 0; i < size; i++) { for (int b : cal.values()) { int v = helper.read(bis); if (v != b) { Assert.fail("Mismatch: " + v + " vs " + b + " at " + counter);
private void buildCodes() { codes = new TreeMap<>(); int codeLength = 0, codeValue = -1; for (final Object key : codeBook.keySet()) { // Iterate over code lengths @SuppressWarnings("SuspiciousMethodCalls") final SortedSet<Integer> get = codeBook.get(key); final int intKey = Integer.parseInt(key.toString()); for (final Integer entry : get) { // Iterate over symbols final HuffmanBitCode code = new HuffmanBitCode(); code.bitLength = intKey; // given: bit length code.value = entry; // given: symbol codeValue++; // increment bit value by 1 final int delta = intKey - codeLength; // new length? codeValue = codeValue << delta; // pad with 0's code.bitCode = codeValue; // calculated: huffman code codeLength += delta; // adjust current code length if (NumberOfSetBits(codeValue) > intKey) throw new IllegalArgumentException("Symbol out of range"); codes.put(entry, code); // Store HuffmanBitCode } } }
private void buildCodes() { codes = new TreeMap<Integer, HuffmanBitCode>(); int codeLength = 0, codeValue = -1; for (final Object key : codeBook.keySet()) { // Iterate over code lengths @SuppressWarnings("SuspiciousMethodCalls") final SortedSet<Integer> get = codeBook.get(key); final int intKey = Integer.parseInt(key.toString()); for (final Integer entry : get) { // Iterate over symbols final HuffmanBitCode code = new HuffmanBitCode(); code.bitLength = intKey; // given: bit length code.value = entry; // given: symbol codeValue++; // increment bit value by 1 final int delta = intKey - codeLength; // new length? codeValue = codeValue << delta; // pad with 0's code.bitCode = codeValue; // calculated: huffman code codeLength += delta; // adjust current code length if (NumberOfSetBits(codeValue) > intKey) throw new IllegalArgumentException("Symbol out of range"); codes.put(entry, code); // Store HuffmanBitCode } } }
@Override public void write(final Byte value) { try { helper.write(coreBlockOutputStream, value); } catch (IOException e) { throw new RuntimeIOException(e); } }
@Override public Byte read() { try { return helper.read(coreBlockInputStream); } catch (IOException e) { throw new RuntimeIOException(e); } }
/** * Construct a Canonical Huffman Codec for Byte data * * @param coreBlockInputStream the input bitstream to read from * @param coreBlockOutputStream the output bitstream to write to * @param values the alphabet (provided as Integers) * @param bitLengths the number of bits of symbol's huffman code */ public CanonicalHuffmanByteCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, final byte[] values, final int[] bitLengths) { super(coreBlockInputStream, coreBlockOutputStream); helper = new HuffmanByteHelper(values, bitLengths); }