混合整数和双精度类型并将它们打包为原始二进制格式,并用perl

问题描述:

在perl中,只有整数和双精度的数组,如 @array = qw/4 3.1416 6.7 15 4.3 /, 如何打包列表转换成二进制序列并保存到一个.bi文件中,其中二进制文件在元素为整数时必须完全是int,在元素为双精度时必须为double。这种格式非常重要,因为我需要将它提供给外部可执行文件。混合整数和双精度类型并将它们打包为原始二进制格式,并用perl

+1

不要使用类似JSON的可解析格式。 – Sobrique

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
  • 为双精度浮点数格式为d
  • 没有指定字节序(对于整数和浮点数):
    • 小端(追加<
    • 大端(追加>
    • 本地字节顺序(没有后缀)
+1

也许你应该在回答之前停下来思考。我再说一遍:第一段代码会产生不可用的输出。期。考虑一下'@array = qw/4.0 ... /'vs'@array = qw/4.1 ... /' – ikegami

+0

我很抱歉,我可能误解了某些内容,但是您的第一个建议运行良好。 – Aki

+0

You显然没有运行我提到的测试。我无法阻止你对自己撒谎,但这是你的计划将会破坏,你的名声在线上,而不是我的。 – ikegami