哈夫曼编码和解码示例

package main

import (
   "fmt"
   "golang.org/x/net/http2/hpack"
)

func main() {
   // ========== 编码示例 ========== //
   str := "nginx"
   fmt.Printf("%+v  <=====>  %+v \n", str, HuffmanEncode(str))
   // nginx  <=====>  \x84\xaa\x63\x55\xe7

   // ========== 解码示例 ========== //
   str = "\x84\xaa\x63\x55\xe7"
   fmt.Printf("%+v  <=====>  %+v \n", "\\x84\\xaa\\x63\\x55\\xe7", HuffmanDecode(str))
   // \x84\xaa\x63\x55\xe7  <=====>  nginx
}

// HuffmanEncode
// @description 编码
// @param str string 原字符串
// @return code string 编码字符串
func HuffmanEncode(str string) (code string) {
   huffman := hpack.AppendHuffmanString(nil, str)
   length := hpack.HuffmanEncodeLength(str) | 0x80 // 十六进制0x80等于十进制128

   code += ByteToHex(byte(length))

   for _, b := range huffman {
      code += ByteToHex(b)
   }

   return code
}

// HuffmanDecode
// @description 解码
// @param code string 编码字符串
// @return str string 原字符串
func HuffmanDecode(code string) (str string) {
   bytes := []byte(code)
   str, _ = hpack.HuffmanDecodeToString(bytes[1:])
   return
}

// ByteToHex
// @description 字节转十六进制字符串
// @param b byte 字节
// @return string 十六进制字符串
func ByteToHex(b byte) string {
   return fmt.Sprintf("\\x%x", b) // 字节转为十六进制字符串
}

Copyright © 2024 码农人生. All Rights Reserved