如何在Linux下将包含ASCII数字0-9的文件转换为对应数值的十六进制文件
问题根因
- 你使用的
$(< input.txt)语法会将整个文件内容加载为shell命令行参数,而系统对命令行参数的长度存在上限(通常为几十MB级别),1.7GB的文件远超出该限制,因此仅能处理文件开头极少量内容,最终输出只有12字节。 - 现有printf逻辑直接输出字符的ASCII编码对应的十六进制值,没有完成「数字字符→对应数值」的转换,因此输出为
0x30这类ASCII编码结果,不符合预期。
解决方案
方案1:Perl逐行处理(推荐,大文件性能最优)
Perl逐行处理不会加载整个文件到内存,适配GB级大文件,几乎所有Linux发行版默认预装Perl环境,单条命令即可完成转换:
如果你需要输出二进制字节流(即每个数字对应1字节的二进制值,如字符0对应二进制字节0x00),使用命令:
perl -pe 's/([0-9])/chr(hex($1))/eg' input.txt > output.txt
如果你需要输出文本形式的十六进制字符串(即每个数字对应2位十六进制文本,如字符0对应文本00),使用命令:
perl -ne 'chomp; print join("", map {sprintf "%02x", $_} split //) . "\n"' input.txt > output.txt
验证方法
你可以用小测试文件快速验证效果:
- 新建
test.txt,写入测试内容01234567 - 执行对应命令后查看输出,即可得到你需要的
0x00、0x01 ... 0x07对应结果
内容的提问来源于stack exchange,提问作者Eddiie
相关产品推荐
相关产品推荐

