[go] 바이너리 데이터를 압축하는 방법
Run-Length Encoding (RLE)
RLE은 연속되는 값들을 세어 그 횟수만큼 해당 값을 나타내어 데이터를 압축하는 방법입니다. 예를 들어, “AAAABBBCCDAA”는 “4A3B2C1D2A”로 표현될 수 있습니다. RLE은 데이터에서 연속적으로 반복되는 값들이 많을 때 효과적인 방법입니다.
package main
import (
"fmt"
"strings"
)
func runLengthEncoding(data string) string {
var result strings.Builder
length := len(data)
for i := 0; i < length; i++ {
count := 1
for i < length-1 && data[i] == data[i+1] {
count++
i++
}
result.WriteString(fmt.Sprintf("%d%c", count, data[i]))
}
return result.String()
}
func main() {
data := "AAAABBBCCDAA"
compressedData := runLengthEncoding(data)
fmt.Println(compressedData) // Output: 4A3B2C1D2A
}
Huffman Encoding
Huffman Encoding은 가장 빈번하게 나타나는 값을 더 짧은 비트로 나타내어 데이터를 압축하는 방법입니다. 문자 빈도에 따라 가변 길이의 코드를 사용하여 압축률을 높일 수 있습니다.
Huffman Encoding을 구현하는 것은 복잡할 수 있으며, 기존에 구현된 라이브러리를 사용하는 것이 좋습니다. Golang의 “compress” 라이브러리에는 Huffman Encoding이 가능합니다.
package main
import (
"bytes"
"compress/gzip"
"fmt"
"log"
"strings"
)
func huffmanCompress(data string) string {
var buf bytes.Buffer
zw := gzip.NewWriter(&buf)
_, err := zw.Write([]byte(data))
if err != nil {
log.Fatal(err)
}
zw.Close()
return buf.String()
}
func main() {
data := "Hello, this is an example of Huffman Encoding"
compressedData := huffmanCompress(data)
fmt.Println(compressedData)
}
압축 데이터를 다시 원래의 형태로 되돌리는 것은 압축을 해제(decompress)하는 작업이 필요합니다. Golang의 “compress/gzip” 라이브러리를 사용하여 Huffman 압축된 데이터를 해제하는 방법을 살펴볼 수 있습니다.
데이터를 압축하고 해제하는 방법에 대한 더 많은 내용은 다음 문서를 참고하시기 바랍니다:
위에 제시된 예시 코드는 데이터를 압축하는 방법을 보여주기 위한 것으로, 실제 상황에 따라 적절하게 수정이 필요할 수 있습니다.