unix脚本将unsigned int32转换为big endian字节并写入文件

问题描述 投票:0回答:2

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

bash awk byte endianness
2个回答
0
投票

如上所述,使用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 提供)(通常是一行,但是整个文件在这个案例)


0
投票

它可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.