混合整数和双精度类型并将它们打包为原始二进制格式,并用perl
问题描述:
在perl中,只有整数和双精度的数组,如 @array = qw/4 3.1416 6.7 15 4.3 /, 如何打包列表转换成二进制序列并保存到一个.bi文件中,其中二进制文件在元素为整数时必须完全是int,在元素为双精度时必须为double。这种格式非常重要,因为我需要将它提供给外部可执行文件。混合整数和双精度类型并将它们打包为原始二进制格式,并用perl
答
for (@array) {
if (int($_) == $_) {
$output .= pack($int_format, $_);
} else {
$output .= pack($double_format, $_);
}
}
也就是说,你指定的文件格式不能被任何东西读取。读者需要知道下一个要读取的内容是以整数还是双精度来存储,但该信息不可用。
也许你的意思是你想要根据@array
的字符串中是否存在.
来选择格式。在这种情况下,你会使用以下命令:
for (@array) {
if (/\./) {
$output .= pack($double_format, $_);
} else {
$output .= pack($int_format, $_);
}
}
你所提到的,因为读者希望浮点数和整数的特定模式。那么为什么不使用相同的模式呢?
$output .= pack("$int_format$double_format$double_format$int_format$double_format", @array);
注意,我离开的确切格式含糊。那是因为你做得很好。
- 没有指定该整数的大小:
- 8位整数(
c
) - 16位整数(
s
) - 32位整数(
l
) - 64位整数(
q
或使用Math::Int64) - 与
int
相同mpiler已编译的Perl(i
) - 同Perl使用(
j
)
- 8位整数(
- 为双精度浮点数格式为
d
。 - 没有指定字节序(对于整数和浮点数):
- 小端(追加
<
) - 大端(追加
>
) - 本地字节顺序(没有后缀)
- 小端(追加
不要使用类似JSON的可解析格式。 – Sobrique