我想在Unix机器上编写一个脚本(bash/awk/gawk/任何其他标准脚本(,该脚本将无符号整数作为程序参数,然后将其转换为大端序并将字节写入新文件。
像这样:./writebytes 5 输出文件.txt其中 5 是我想写入输出文件的值.txt转换为大端序后以字节为单位
现在如果我这样做十六进制转储输出文件.txt输出应如下所示
0000000 0005 0000
0000004
我对 unix 和脚本非常陌生。然后我希望能够以简单的十进制人类可读格式输出文件的内容.txt。
./readbytes outputfile.txt
输出为 5
使用 perl 将整数的 ascii 表示转换为二进制 32 位大端整数很容易,如前所述,将该值保存到文件中是简单的 shell 重定向:
$ num=5
$ perl -e "print pack('N', $num)" > outputfile.txt
$ xxd outputfile.txt
00000000: 0000 0005
笔记:
- 在这个例子中,变量
$num
的替换是由 shell 完成的,而不是由 perl 本身完成的。 -
pack("N", value)
是将value
转换为 32 位大端整数的 perl 方法。
为了完整起见,小端版本是:
$ perl -e 'print pack("V", 5)' | xxd
00000000: 0500 0000
从文件中读回有点复杂,因为它是二进制数据,而不是面向行的文本。您必须一次读取文件的所有 4 个字节,无论它们是什么。幸运的是,perl 也让这变得简单:
$ perl -0777 -nE 'say unpack("N", $_)' outputfile.txt
5
-0777
参数是与 -n
结合使用时一次读取整个文件的惯用方式, 读取文件或标准输入,在每个块上调用脚本的其余部分(由 -E
提供((通常是一行,但在这种情况下是整个文件(
可以使用Perl单行来完成,我想你正在寻找下面这样的东西
$ hexdump <(perl -e ' $x=pack("I",5) ; print $x ')
0000000 0005 0000
0000004
如果要获取 as 参数
$ data=5
$ perl -ne ' $x=pack("I",$_) ; print $x ' <<< "$data" > outfile.txt
$ hexdump outfile.txt
0000000 0005 0000
0000004
$ wc outfile.txt
0 0 4 outfile.txt
要读回 outfile.txt,你可以再次使用 Perl
$ perl -ne ' $a=unpack("I",$_); print $a ' outfile.txt
5
如果你使用的是gawk
,这里有一种奇怪的方法来获取这些大端字节,而无需手动进行除法和模数:
echo 3496432627 |
<小时 /> gawk -b '{ system(gensub("[0-9A-F]{2}", "\\x&", "g",
sprintf(" printf $47%.8X47", $_))) }'
<小时 /> ?gS?
<小时 /> | god --endian=big -t u4
0000000 3496432627
0000004