如何在Golang中读取Charles代理十六进制文件并转换为字节切片
读取Charles导出十六进制文件并转换为Golang []byte的实现方法
格式特征说明
你提供的Charles导出十六进制文件为经典hexdump格式,每行结构固定:
- 开头8位十六进制为当前行的偏移地址
- 中间为16个(最后一行可能更少)两位十六进制字节
- 末尾为对应字节的ASCII可视化预览,包含不可见字符的位置会用占位符显示
便捷实现方案
方案1:纯命令行快速转换(无需写代码)
如果只是临时需要转换文件,Linux/macOS下可以直接使用xxd工具的反向转换功能:
xxd -r charles_export.hex output.bin
转换完成后直接在Go中读取output.bin即可直接得到[]byte,无需额外处理。
方案2:Go代码内置解析
如果需要在Go程序中直接处理这类文件,核心逻辑如下:
- 按行读取文件,跳过空行
- 提取每行中间的十六进制字节段,跳过开头偏移和末尾ASCII预览
- 调用标准库
encoding/hex直接转换为[]byte
完整可运行代码:
package main import ( "bufio" "encoding/hex" "fmt" "os" "strings" ) func ParseCharlesHex(filePath string) ([]byte, error) { // 打开目标文件 f, err := os.Open(filePath) if err != nil { return nil, fmt.Errorf("open file failed: %w", err) } defer f.Close() var hexBuf strings.Builder scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" { continue } // 按任意空白符拆分所有字段 fields := strings.Fields(line) if len(fields) < 2 { continue } // 遍历字段,仅取两位长度的十六进制字节 for i := 1; i < len(fields); i++ { seg := fields[i] // 遇到长度不为2的字段,说明已经到ASCII预览区,终止本行解析 if len(seg) != 2 { break } hexBuf.WriteString(seg) } } if err = scanner.Err(); err != nil { return nil, fmt.Errorf("read file failed: %w", err) } // 十六进制字符串转字节切片 return hex.DecodeString(hexBuf.String()) } func main() { // 测试调用 byteData, err := ParseCharlesHex("your_charles_export_file.hex") if err != nil { panic(err) } // 验证转换结果,直接转字符串即可看到原始JSON内容 fmt.Println(string(byteData)) }
行分割处理说明
- 常规场景下直接使用
bufio.Scanner的默认行分割规则即可,会自动适配\n、\r\n等不同系统的换行格式,也能过滤掉行首尾的空白字符和不可见换行符 - 如果文件中存在异常的非标准换行符,可以自定义
bufio.SplitFunc实现自定义分割逻辑,一般Charles导出的标准hexdump文件不需要额外处理。
内容的提问来源于stack exchange,提问作者Yafei Chang
相关产品推荐
相关产品推荐

