我想在unix机器上编写一个脚本(bash / awk / gawk /任何其他标准脚本),该机器具有无符号整数作为程序参数,然后将其转换为大端并将字节写入新文件。
像这样:./ writebytes 5 outputfile.txt其中5是我想在转换为big endian后以字节为单位写入outputfile.txt的值
现在如果我做hexdump outputfile.txt输出应该是这样的
0000000 0005 0000
0000004
我是unix和脚本的新手。然后我希望能够以简单的十进制人类可读格式输出outputfile.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方法。为了完整起见,little-endian版本是:
$ perl -e 'print pack("V", 5)' | xxd
00000000: 0500 0000
从文件中读回来有点复杂,因为它是二进制数据,而不是面向行的文本。无论它们是什么,您都必须一次读取文件的所有4个字节。幸运的是perl也很容易:
$ perl -0777 -nE 'say unpack("N", $_)' outputfile.txt
5
-0777
参数是与-n
结合读取整个文件的惯用方法,-E
读取文件或标准输入,在每个块上调用脚本的其余部分(由$ hexdump <(perl -e ' $x=pack("I",5) ; print $x ')
0000000 0005 0000
0000004
提供)(通常是一行,但是整个文件在这个案例)
它可以使用Perl one-liner完成,我想你正在寻找类似下面的东西
$ 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
如果你想得到参数
$ perl -ne ' $a=unpack("I",$_); print $a ' outfile.txt
5
要将它读回outfile.txt,您可以再次使用Perl
qazxswpoi