在shell中编写二进制文件(shell,awk)

elc*_*uco 18 bash awk busybox

我的问题是我需要创建一个具有这个确切字节的文件:48,00,49,00

我不能使用C(因为我无法部署任何东西,没有perl,没有其他脚本语言.我尝试使用awk,在桌面上它确实有效:

# awk  'BEGIN{ printf "%c%c%c%c", 48, 00, 49, 00 }' | hexdump
0000000 0030 0031                              
0000004
Run Code Online (Sandbox Code Playgroud)

但是目标平台正在运行busybox v1.13.2,并且此代码在那里不起作用.那里的awk版本没有输出ascii"0"(所有其他值都没问题).

你有什么建议?

yoh*_*eau 27

您可以使用以下命令:

echo -n -e \\x48\\x00\\x49\\x00 > myfile
Run Code Online (Sandbox Code Playgroud)


Mic*_*ack 6

POSIX AWK标准表示将%0传递给带有%c格式的AWK的printf会导致未指定的行为.但是... POSIX echo也非常有限,虽然八进制和十六进制说明符(和-n)可以在GNU echo和BASH内置...但它们可能无法在任何地方工作.为了最大限度地提高在所有POSIX系统上获得一致行为的可能性,最好使用shell命令行的printf而不是其中任何一个.

$ printf '\060\000\061\000' | od -An -tx1
 30 00 31 00
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪......你可能想要输出0x48,0x00,0x49,0x00--这看起来像八进制中的漂亮导频数:

$ printf '\110\000\111\000' | od -An -tx1
 48 00 49 00
Run Code Online (Sandbox Code Playgroud)


flo*_*olo 5

你可以尝试回声,这也允许任意ascii字符(这些数字是八进制数字).

echo -n -e \\0060\\0000\\0061\\0000  | hexdump
Run Code Online (Sandbox Code Playgroud)

  • 仅供将来参考,它确实接受十六进制。只需使用 \\xNN,其中 N 是十六进制数。 (2认同)