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