尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

yq Base64 编解码实战指南:彻底掌握 yq 的 -p=base64 与 -o=base64

yq Base64 编解码实战指南:彻底掌握 yq 的 -p=base64 与 -o=base64 yq Base64 编解码实战指南彻底掌握 yq 的 -pbase64 与 -obase64【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yqyq 除了处理 YAML、JSON、XML、CSV、TOML、HCL 和 properties 之外还支持 Base64 格式既可以把 Base64 文本作为输入解码-pbase64也可以把查询结果编码为 Base64 输出-obase64。本文基于 yq 仓库的 Base64 文档及其编解码器源码、测试用例完整讲解 Base64 模式的用法、编码规范假设RFC 4648、UTF-8 字符串、边界行为多余空白、缺失填充、非字符串报错帮助你在脚本中安全地实现 Base64 与各类数据格式之间的转换。Base64 模式概述编码规范与前提假设yq 对 Base64 的处理遵循以下两条核心假设见文档 pkg/yqlib/doc/usage/headers/base64.md遵循 RFC 4648 标准编码编解码均使用 Base64 标准字母表A–Z、a–z、0–9、、/填充符而不是 URL 安全变体-、_。内容必须是 UTF-8 字符串而非二进制内容无论是编码还是解码yq 都假定 Base64 承载的是 UTF-8 文本字符串。这意味着 yq 的 Base64 模式适合文本类场景如把字符串嵌入配置、在系统中传递文本而不是传输任意二进制文件。这两个假设在源码中得到直接印证。解码器与编码器均直接使用 Go 标准库的base64.StdEncoding解码器 pkg/yqlib/decoder_base64.goNewBase64Decoder返回的base64Decoder以*base64.StdEncoding初始化编码器 pkg/yqlib/encoder_base64.goNewBase64Encoder同样使用*base64.StdEncoding。另外编解码器都带//go:build !yq_nobase64构建标签见 decoder_base64.go 与 encoder_base64.go即通过编译参数可裁剪 Base64 支持默认构建则完整包含该能力。在命令行上的对应关系是参数作用-pbase64以 Base64 方式解析输入文件/标准输入解码再按 yq 表达式求值-obase64将求值结果编码为 Base64 输出完整的命令示例文档见 pkg/yqlib/doc/usage/base64.md。解码 Base64把 Base64 文本变成字符串解码时yq 假定解码后的数据是一个字符串。以下示例完整继承自仓库文档 pkg/yqlib/doc/usage/base64.md。基本解码给定sample.txt文件YSBzcGVjaWFsIHN0cmluZw执行yq -pbase64 -oy . sample.txt输出a special string解码 UTF-8 内容Base64 解码支持 UTF-8 编码的字符串。给定sample.txt文件V29ya3Mgd2l0aCBVVEYtMTYg8JYig执行yq -pbase64 -oy . sample.txt输出Works with UTF-16 可以看到多字节 Unicode 字符如 emoji能正确还原。注意测试常量 pkg/yqlib/base64_test.go 中这一对样例base64EncodedUTF8/base64DecodedUTF8与文档示例完全一致说明文档输出即由该测试场景真实运行生成。解码带多余空白的输入首尾的空白leading/trailing whitespace会被自动剥离。给定sample.txt文件YSBzcGVjaWFsIHN0cmluZw执行yq -pbase64 -oy . sample.txt输出a special string这一行为对应 pkg/yqlib/decoder_base64.go 中Init方法的实现解码器先把整个输入读入缓冲区注释明确说明 Base64 解码需要看到完整输入才能正确处理填充再用strings.TrimSpace去掉首尾空白随后按len % 4计算缺失的填充位数并补齐字符stripped : strings.TrimSpace(buf.String()) padLen : len(stripped) % 4 if padLen 0 { stripped strings.Repeat(, 4-padLen) }由此可以确认两个源码级事实缺失填充会被自动补齐。例如Y2F0cw无也能正常解码为cats这正是 pkg/yqlib/base64_test.go 中 decode missing padding 场景验证的行为解码结果是一个字符串标量节点Decode方法最终调用createStringScalarNode(buf.String())返回decoder_base64.go。空输入也是合法场景——测试中 empty decode 场景确认空 Base64 解码为空字符串base64_test.go。由于输入先被解析为字符串节点解码后的数据还可以继续作为字符串参与后续表达式处理若解码出的文本本身是 YAML 内容测试中的 decode yaml document 场景YTogYXBwbGUK解码为a: apple它仍按字符串对待需要时可用eval等算子进一步解释。编码 Base64把字符串编码输出编码时yq 只接受字符串。以下示例同样完整继承自 pkg/yqlib/doc/usage/base64.md。直接编码字符串给定sample.yml文件a special string执行yq -obase64 . sample.yml输出YSBzcGVjaWFsIHN0cmluZw从文档中提取字段再编码从文档中取出一个字符串字段并编码为 Base64。给定sample.yml文件coolData: a special string执行yq -obase64 .coolData sample.yml输出YSBzcGVjaWFsIHN0cmluZw编码器实现见 pkg/yqlib/encoder_base64.goEncode方法先检查节点的 tag只有!!str字符串才允许编码if node.guessTagFromCustomType() ! !!str { return fmt.Errorf(cannot encode %v as base64, can only operate on strings, node.Tag) } _, err : writer.Write([]byte(e.encoding.EncodeToString([]byte(node.Value))))两个值得注意的实现细节非字符串输入会明确报错而不是静默失败。测试用例 pkg/yqlib/base64_test.go 覆盖了三类报错场景错误信息格式固定为cannot encode tag as base64, can only operate on strings整数输入123→cannot encode !!int as base64, can only operate on strings数组输入[1, 2, 3]→cannot encode !!seq as base64, can only operate on strings映射输入{b: c}→cannot encode !!map as base64, can only operate on strings不支持别名aliases编码器的CanHandleAliases()返回falseencoder_base64.go即输出中不会出现 YAML 锚点/别名结构——Base64 输出只是一段纯文本。往返一致性与适用边界测试文件 pkg/yqlib/base64_test.go 中还包含一组往返roundtrip场景解码后再编码见 L126-L152覆盖普通字符串、UTF-8 内容、缺失填充的输入以及空字符串。这组测试印证了 Base64 模式的一个实用特性解码输出是纯字符串因此yq -pbase64的输出可以无缝作为yq -obase64的输入形成可组合的管道。例如把一段 Base64 文本规范化补齐填充、去掉空白只需yq -pbase64 -obase64 .结合前述内容使用 yq Base64 模式时应记住的适用前提与限制只处理 UTF-8 字符串编码和解码都假定内容是 UTF-8 文本而非任意二进制数据标准字母表基于 RFC 4648 的标准编码若遇到 URL 安全变体-/_的 Base64 内容需自行预处理后再交给 yq编码输入必须是字符串节点整数、数组、映射等均会报can only operate on strings错误解码对空白和缺失填充宽容首尾空白被剥离缺失的填充自动补齐这在处理从日志、邮件等渠道复制来的 Base64 文本时很实用。附Base64 文档在仓库中的组织方式按 CONTRIBUTING.md 描述的文档体系yq 的使用文档由两部分拼接生成静态头文件doc/usage/headers/*.md与doc/operators/headers/*.md加上由测试场景动态生成的内容。Base64 即为例证静态头文件 pkg/yqlib/doc/usage/headers/base64.md 只承载标题、编码规范假设RFC 4648、UTF-8 字符串等固定说明各示例小节Decode base64: simple、Encode base64: string 等由 pkg/yqlib/base64_test.go 中的TestBase64Scenarios测试在运行用例的同时生成skipDoc: false的场景如 Decode base64: simple、Decode base64: UTF-8、Decode with extra spaces、两个 Encode 场景写入最终文档 pkg/yqlib/doc/usage/base64.md这种文档即测试的机制意味着文档中的每条命令输出都经过了真实执行验证——若解码行为变化文档也会随之重新生成。因此阅读 yq 的 Base64 文档时若发现文档与源码行为不符优先以 pkg/yqlib/base64_test.go 的测试场景为准并运行go test -run TestBase64Scenarios在 pkg/yqlib 目录下重新生成文档核对。【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表