如何在Convert :: IBM390中解压缩小端或大端

时间:2015-02-25 07:52:37

标签: perl ebcdic

我正在使用Convert::IBM390将EBCDIC文件转换为ASCII文件。

#!/usr/bin/perl -w

use warnings;
use Convert::IBM390 qw(:all);

open EBCDIC, "<D:/EBCDIC.txt" or die "error -> opening $!";
open ASCII, ">D:/ASCII.txt" or die "error -> opening $!";

my $text;
my $template = 'e15.0 e15 z4 I2 I2 i2 N16.0 p11.0';
binmode EBCDIC;
while (read (EBCDIC, $buffer, 67))
{
   @fields = unpackeb($template, $buffer);
   $text= join(",",@fields);
   print ASCII $text."\n";
}

close EBCDIC;
close ASCII;

我在这个link

中得到了这个脚本

当EBCDIC数据包含 Little或Big Endian 整数时,我遇到了问题。

我已经搜索过解压缩这些字符并使用N/n V/v但是这个模块不接受这些内容。 得到错误

Invalid type in unpackeb: 'N'

大型机的EBCDIC文件由以下列组成:

EBCDIC Decimal(15,0)
EBCDIC String(15)
Zoned Decimal(4)
unsigned little endian integer(2)
unsigned big endian integer(2)
signed big endian integer(2)
big endian decimal(16,0)
packed decimal(11,0)

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您是否意识到所有多字节二进制数必须是小端还是大端?

我认为你想要反转字节顺序的i / Is / S字段? Convert::IBM390不会让你这样做,但我并不感到惊讶,因为IBM System / 360,System / 370和ESA / 390都是大端的,你永远不会得到任何小端的数据。您的数据来自哪里?

我最好的建议是你编写一个简单的转换例程,该例程采用32位值并返回相同的值,并以其字节顺序反转。这是一个实现swap_endianness_32并演示其功能的程序。

use strict;
use warnings;

printf "%08X\n", swap_endianness_32(0x12345678);

sub swap_endianness_32 {
    unpack 'N', pack 'V', shift;
}

<强>输出

78563412