huffman-archiver/internal/huffman/decode.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()
}