将十进制数序列转换为Big endian float

时间:2017-03-20 17:05:36

标签: linux perl awk byte endianness

我有一个外部软件,它使用存储为长字节4字节浮点数的图像,如Big Endian,没有标题。我可以使用awk创建一个小的示例图像,因此我可以控制可能的分隔符,或输出我的(浮点)数字序列,例如,十六进制或十进制值。但是,我还没有找到一种方法将其作为4字节浮点数写入文件。因此,我尝试使用Perl的包来将我的十进制base10数字序列转换为4字节浮点数Big Endian,它适用于单个值,但我的Perl体验太有限了,无法使其适用于序列价值观

Perl更熟练的人可以帮助我吗?要查看输出位序列,我将其传递给命令xxd -b

perl -e "print pack('f>*',3)"|xxd -b # outputs decimal 3 (base10) on the wanted format:
# 01000000 01000000 00000000 00000000

 perl -e "print pack('f>*',3,7,8)"|xxd -b # outputs the requested dummy sequence correctly
# 01000000 01000000 00000000 00000000 01000000 11100000
# 00000000 00000000 01000001 00000000 00000000 00000000

echo 1|awk 'BEGIN{printf("%d,%d,%d",3,7,8);}'|xxd -b # creates same dummy sequence, in awk - here separated by ,

echo 1|awk 'BEGIN{printf("%d,%d,%d",3,7,8);}'|perl -e "print pack('f>*',<STDIN>)"|xxd -b
# outputs correct conversion of 3, but seems to ignore 7 and 8
# 01000000 01000000 00000000 00000000

我猜分隔符必须以不同的方式处理?我也尝试过这种形式的Perl部分

perl -ne 'print pack "f>*",$_'

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

替换

<STDIN>

split(/,/, <STDIN>)

此外,如果您将Perl程序包装在单引号中,这可能是最好的。没有区别,但这是一个好习惯。

perl -e'print pack "f>*", split /,/, <STDIN>'

干净地处理换行符(如果有的话):

perl -ne'chomp; print pack "f>*", split /,/'