package ua.stu.scplib.structure; /** * <p>A class to store Huffman Tables, either as read from an SCP-ECG file or the default as specified in the SCP-ECG standard.</p> * * @see ua.stu.scplib.structure.DefaultHuffmanTable * @see ua.stu.scplib.structure.HuffmanDecoder * * @author stu */ public class HuffmanTable { protected int numberOfCodeStructuresInTable; protected int[] numberOfBitsInPrefix; protected int[] numberOfBitsInEntireCode; protected int[] tableModeSwitch; protected int[] baseValueRepresentedByBaseCode; protected long[] baseCode; public int getNumberOfCodeStructuresInTable() { return numberOfCodeStructuresInTable; } public int[] getNumberOfBitsInPrefix() { return numberOfBitsInPrefix; } public int[] getNumberOfBitsInEntireCode() { return numberOfBitsInEntireCode; } public int[] getTableModeSwitch() { return tableModeSwitch; } public int[] getBaseValueRepresentedByBaseCode() { return baseValueRepresentedByBaseCode; } public long[] getBaseCode() { return baseCode; } protected HuffmanTable() { } /** * <p>Construct a Huffman Table from the supplied data as read from an SCP-ECG file.</p> * * @param numberOfCodeStructuresInTable the number of codes (i.e. the size of all the array parameters) * @param numberOfBitsInPrefix for each code, the number of prefix bits for each code (i.e. the Huffman code) * @param numberOfBitsInEntireCode for each code, if > numberOfBitsInPrefix, used to find the number of original bits encoded * @param tableModeSwitch for each code, a flag to indicate to switch to another table (1 indicates no switch) * @param baseValueRepresentedByBaseCode for each code, the value that the code represents * @param baseCode the codes (with the order of bits reversed) */ public HuffmanTable(int numberOfCodeStructuresInTable, int[] numberOfBitsInPrefix, int[] numberOfBitsInEntireCode, int[] tableModeSwitch, int[] baseValueRepresentedByBaseCode, long[] baseCode) { this.numberOfCodeStructuresInTable=numberOfCodeStructuresInTable; this.numberOfBitsInPrefix=numberOfBitsInPrefix; this.numberOfBitsInEntireCode=numberOfBitsInEntireCode; this.tableModeSwitch=tableModeSwitch; this.baseValueRepresentedByBaseCode=baseValueRepresentedByBaseCode; this.baseCode=baseCode; } /** * <p>Dump the tables as a <code>String</code>.</p> * * @return the tables as a <code>String</code> */ public String toString() { StringBuffer strbuf = new StringBuffer(); strbuf.append("Number Of Code Structures = "+numberOfCodeStructuresInTable+"\n"); for (int i=0; i<numberOfCodeStructuresInTable; ++i) { strbuf.append("\tCode Structure = "+i+"\n"); strbuf.append("\t\tNumber Of Bits In Prefix = "+numberOfBitsInPrefix[i]+" dec (0x"+Integer.toHexString(numberOfBitsInPrefix[i])+")\n"); strbuf.append("\t\tNumber Of Bits In Entire Code = "+numberOfBitsInEntireCode[i]+" dec (0x"+Integer.toHexString(numberOfBitsInEntireCode[i])+")\n"); strbuf.append("\t\tTable Mode Switch = "+tableModeSwitch[i]+" dec (0x"+Integer.toHexString(tableModeSwitch[i])+")\n"); strbuf.append("\t\tBase Value Represented By Base Code = "+baseValueRepresentedByBaseCode[i]+ " dec (0x"+Integer.toHexString(baseValueRepresentedByBaseCode[i])+")\n"); strbuf.append("\t\tBase Code = "+baseCode[i]+" dec (0x"+Long.toHexString(baseCode[i])+")\n"); } return strbuf.toString(); } }