You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:09:05