如何使用 Bash 编写二进制文件?
我的问题是我需要创建一个具有以下确切字节的文件:48, 00, 49, 00
。
我不能使用C、perl、其他脚本语言(目标是嵌入式设备)。我使用 awk 尝试了这一点,在桌面上它确实有效:
# awk 'BEGIN{ printf "%c%c%c%c", 48, 00, 49, 00 }' | hexdump
0000000 0030 0031
0000004
但是目标平台正在运行 busybox v1.13.2 并且此代码在那里不起作用。那里的 awk 版本不输出 ascii“0”(所有其他值都可以)。
您有什么建议?
My problem is that I need to create a file with this exact bytes: 48, 00, 49, 00
.
I cannot use C, perl, other scripting language (the target is an embedded device). I tried this using awk, and in desktop it does work:
# awk 'BEGIN{ printf "%c%c%c%c", 48, 00, 49, 00 }' | hexdump
0000000 0030 0031
0000004
However the target platform is running busybox v1.13.2 and this code does not work there. The awk version there does not output ascii "0" (all other values are ok).
What are your recommendations?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以使用以下命令:
you can use the following command:
我需要在旧的 Android shell 中使用 busybox 从十六进制写入二进制文件。这个带有重定向的 printf 在我的用例中有效。
以十六进制写入二进制数据:
以十六进制显示结果:
以 ascii 显示结果:
I needed to write binary files from hex using busybox within an old Android shell. This
printf
with a redirect worked in my use case.Write the binary data in hex:
Display the result in hex:
Display the result in ascii:
你可以尝试 echo,它也允许任意 ascii 字符(这些数字是八进制数字)。
you could try echo, that also allows arbitrary ascii chars (those numbers are octal numbers).
POSIX AWK 标准规定,以 %c 格式将 0 传递给 AWK 的 printf 可能会导致未指定的行为。然而...... POSIX echo 也非常有限,尽管八进制和十六进制说明符(和 -n)将在 GNU echo 和 BASH 内置上工作......它们可能无法在任何地方工作。为了最大限度地提高在所有 POSIX 系统上获得一致行为的机会,最好使用 shell 命令行的 printf,而不是使用其中任何一个。
不过,这对我来说看起来很奇怪......你可能想输出 0x48、0x00、0x49、0x00 ——这看起来像一个漂亮的八进制引导号:
POSIX AWK standard says that passing a 0 to AWK's printf with %c format can result in unspecified behaviour. However... POSIX echo also is very limited, and though octal and hexadecimal specifiers (and -n) will work on GNU echo and BASH built-in... They may not work everywhere. To maximize the chance that you get consistent behaviour on all POSIX systems, it is better to use the shell command line's printf than either of these.
This looks odd to me though... You may be wanting to output 0x48, 0x00, 0x49, 0x00 -- which looks like a pretty pilot number in octal:
几个更通用的函数来输出整数:
用于为 iio 数据流制作音频 WAV 文件头:
Linux iio ADC 数据捕获到 WAV 文件:
A couple of more general functions to output integers:
Use to make an audio WAV file header for iio data stream:
Linux iio ADC data capture to WAV file:
我不知道 busybox 中有什么,但这可能有效,因为 printf 比 awk 小。
这是输出:
I don't know what's in busybox, but this might work because printf is smaller than awk.
This is the output: