41 lines
767 B
Go
41 lines
767 B
Go
package huffman
|
|
|
|
import (
|
|
. "huffman/internal/io"
|
|
"io"
|
|
)
|
|
|
|
func Decode(reader io.ReadSeeker, writer io.Writer) {
|
|
bufReader := NewBufferedReader(reader)
|
|
bufWriter := NewBufferedWriter(writer)
|
|
|
|
tree := DecodeTree(bufReader)
|
|
|
|
if tree.Size == 1 {
|
|
lg := int(bufReader.ReadByte())
|
|
size := int(bufReader.ReadBits(lg))
|
|
|
|
for i := 0; i < size; i++ {
|
|
bufWriter.WriteByte(tree.Value)
|
|
}
|
|
} else {
|
|
additionalBits := bufReader.ReadBits(3)
|
|
bufReader.SetLastBitsSkip(int(additionalBits))
|
|
|
|
curNode := tree
|
|
for !bufReader.IsEOF() {
|
|
if bufReader.ReadBit() == 0x0 {
|
|
curNode = curNode.Left
|
|
} else {
|
|
curNode = curNode.Right
|
|
}
|
|
|
|
if curNode.IsTerminate() {
|
|
bufWriter.WriteByte(curNode.Value)
|
|
curNode = tree
|
|
}
|
|
}
|
|
}
|
|
|
|
bufWriter.Flush()
|
|
}
|