mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-12-01 09:50:32 +00:00
added walk()
This commit is contained in:
parent
0b033429b4
commit
816548386e
@ -1,8 +1,10 @@
|
|||||||
package com.bytezone.diskbrowser.wizardry;
|
package com.bytezone.diskbrowser.wizardry;
|
||||||
|
|
||||||
|
import com.bytezone.diskbrowser.applefile.AbstractFile;
|
||||||
|
|
||||||
// Based on a pascal routine by Tom Ewers
|
// Based on a pascal routine by Tom Ewers
|
||||||
|
|
||||||
public class Huffman
|
public class Huffman extends AbstractFile
|
||||||
{
|
{
|
||||||
private final byte[] tree;
|
private final byte[] tree;
|
||||||
private final byte[] left;
|
private final byte[] left;
|
||||||
@ -13,8 +15,12 @@ public class Huffman
|
|||||||
private int currentByte;
|
private int currentByte;
|
||||||
private byte[] message;
|
private byte[] message;
|
||||||
|
|
||||||
public Huffman (byte[] buffer)
|
private String treeContents;
|
||||||
|
|
||||||
|
public Huffman (String name, byte[] buffer)
|
||||||
{
|
{
|
||||||
|
super (name, buffer);
|
||||||
|
|
||||||
tree = new byte[256];
|
tree = new byte[256];
|
||||||
left = new byte[256];
|
left = new byte[256];
|
||||||
right = new byte[256];
|
right = new byte[256];
|
||||||
@ -47,7 +53,7 @@ public class Huffman
|
|||||||
{
|
{
|
||||||
if (bitNo-- == 0)
|
if (bitNo-- == 0)
|
||||||
{
|
{
|
||||||
bitNo = 7;
|
bitNo += 8;
|
||||||
currentByte = message[msgPtr++] & 0xFF;
|
currentByte = message[msgPtr++] & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,4 +74,36 @@ public class Huffman
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getText ()
|
||||||
|
{
|
||||||
|
if (treeContents == null)
|
||||||
|
{
|
||||||
|
StringBuilder text = new StringBuilder ();
|
||||||
|
walk (0, "", text);
|
||||||
|
treeContents = text.toString ();
|
||||||
|
}
|
||||||
|
return treeContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void walk (int treePtr, String path, StringBuilder text)
|
||||||
|
{
|
||||||
|
if ((tree[treePtr] & 0x01) == 0)
|
||||||
|
walk (left[treePtr] & 0xFF, path + "1", text);
|
||||||
|
else
|
||||||
|
print (path + "1", left[treePtr], text);
|
||||||
|
|
||||||
|
if ((tree[treePtr] & 0x02) == 0)
|
||||||
|
walk (right[treePtr] & 0xFF, path + "0", text);
|
||||||
|
else
|
||||||
|
print (path + "0", right[treePtr], text);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void print (String path, byte value, StringBuilder text)
|
||||||
|
{
|
||||||
|
int val = value & 0xFF;
|
||||||
|
char c = val < 32 || val >= 127 ? ' ' : (char) val;
|
||||||
|
text.append (String.format ("%3d %1.1s %s%n", val, c, path));
|
||||||
|
}
|
||||||
}
|
}
|
@ -94,11 +94,9 @@ public class Wizardry4BootDisk extends PascalDisk
|
|||||||
|
|
||||||
byte[] buffer = fileEntry.getDataSource ().buffer;
|
byte[] buffer = fileEntry.getDataSource ().buffer;
|
||||||
|
|
||||||
Huffman huffman = new Huffman (buffer);
|
Huffman huffman = new Huffman ("Huffman tree", buffer);
|
||||||
messageBlock.setHuffman (huffman);
|
messageBlock.setHuffman (huffman);
|
||||||
|
fileEntry.setFile (huffman);
|
||||||
// for (int msg = 2043; msg <= 2045; msg++)
|
|
||||||
// System.out.println (huffman.getMessage (messageBlock.getMessage (msg)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user