求助:将Hi.text内容转换为C printf格式的Shell命令
解决方法:将4字节int内容转换为C语言printf语句
我来帮你搞定这个转换问题!根据你说的「所有内容均为4字节大小的int类型」,分两种常见场景给你可行的命令:
场景1:Hi.text是文本格式(每行一个int数值,十进制/十六进制)
如果你的文件里是每行一个可读的int数值(比如十进制123或者十六进制0x1a),用这条awk命令就能直接生成对应的printf语句:
十进制数值转换
awk '{printf("printf(\"%%d\\n\", %d);\n", $0)}' Hi.text
比如输入是123,输出就是printf("%d\n", 123);
十六进制数值转换
如果文件里是十六进制值(不带0x前缀也可以),用这条:
awk '{printf("printf(\"%%x\\n\", 0x%s);\n", $0)}' Hi.text
输入1a的话,输出就是printf("%x\n", 0x1a);
场景2:Hi.text是二进制格式(直接存储4字节int的二进制数据)
awk本身是处理文本文件的,直接处理二进制文件会出问题,这时候我们可以用od命令先把二进制转成可读的数值,再配合awk生成printf语句:
十进制输出的printf语句
od -t d4 -An -w4 Hi.text | awk '{printf("printf(\"%%d\\n\", %d);\n", $0)}'
解释一下参数:
od -t d4:按4字节十进制整数解析二进制内容-An:去掉输出里的地址列-w4:每行只输出一个4字节的数值
十六进制输出的printf语句
如果需要生成十六进制的printf,把-t d4改成-t x4即可:
od -t x4 -An -w4 Hi.text | awk '{printf("printf(\"%%x\\n\", 0x%s);\n", $0)}'
字节序适配
如果你的二进制int是小端/大端格式,还可以用-endian参数指定,比如小端的话:
od -t d4 -endian little -An -w4 Hi.text | awk '{printf("printf(\"%%d\\n\", %d);\n", $0)}'
为什么之前的awk命令没成功?
大概率是因为你直接用awk处理二进制文件了——awk会把二进制里的非文本字符当成分隔符或者乱码处理,导致解析错误。换成上面的二进制处理方法就能解决啦!
内容的提问来源于stack exchange,提问作者user1846251
相关产品推荐
相关产品推荐

