Unix 脚本,用于将无符号的 int32 转换为大字节序字节并写入文件



我想在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

最新更新