将无符号 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=]) 在每个块上(通常是一行,但在这种情况下是整个文件)
我想在具有无符号整数作为程序参数的 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=]) 在每个块上(通常是一行,但在这种情况下是整个文件)