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



在perl中,有一个只有整数和双精度的数组,如 @array = qw/4 3.1416 6.7 15 4.3/, 如何将列表打包成一系列二进制文件并将其保存到 .bi 文件中,当元素为整数时,二进制文件必须恰好是 int,当元素为双精度时,二进制文件必须恰好是 bin。这种格式是必不可少的,因为我需要将其提供给外部可执行文件。

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(
    • 与编译 Perl 的编译器的int相同(i(
    • 与 Perl 使用相同 (j(
  • 双精度浮点数的格式为d
  • 您没有指定字节序(对于整数和浮点数(:
    • 小端序(附加<(
    • 大端序(追加>(
    • 本机字节序(无后缀(

最新更新