将无符号 int32 转换为大端字节并写入文件的 unix 脚本

unix script to convert unsigned int32 to big endian bytes and write to file

我想在具有无符号整数作为程序参数的 unix 机器上编写一个脚本(bash/awk/gawk/any 其他标准脚本),然后将其转换为大端并将字节写入新文件。

像这样: ./writebytes 5 outputfile.txt 其中 5 是我要在转换为大端

后以字节为单位写入 outputfile.txt 的值

现在如果我这样做 十六进制转储 outputfile.txt 输出应该看起来像

0000000 0005 0000
0000004

我对 unix 和脚本编写还很陌生。 然后我希望能够以简单的十进制人类可读格式输出 outputfile.txt 的内容。

./readbytes outputfile.txt

输出为 5

可以使用 Perl 一行代码来完成,我想你正在寻找类似下面的内容

$ hexdump <(perl -e ' $x=pack("I",5) ; print $x ')
0000000 0005 0000
0000004

如果你想获取作为参数

$ 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

如前所述,使用 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 结合使用时一次读取整个文件的惯用方法,它读取文件或标准输入,调用脚本的其余部分(由 [= 提供) 18=]) 在每个块上(通常是一行,但在这种情况下是整个文件)