Perl 如何在Convert::IBM390中解包little或big-endian

Perl 如何在Convert::IBM390中解包little或big-endian,perl,ebcdic,Perl,Ebcdic,我正在使用将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

我正在使用将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;
大型机中的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)
有什么建议吗

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

我假设它是一个
I
/
I
s
/
s
字段,您想反转它的结尾?看来,
Convert::IBM390
不会让您这样做,但我并不感到惊讶,因为IBM System/360、System/370和ESA/390都是大端,您永远不会得到任何小端数据。你的数据来自哪里

我最好的建议是编写一个简单的转换例程,它接受一个32位的值,并返回相同的值,其终止顺序颠倒。下面是一个实现
swap\u endianness\u 32
并演示其功能的程序

use strict;
use warnings;

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

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

78563412

我的数据文件将来自大型机系统。。。将有一本基于此的副本,该副本将更新
$template
。如果我使用一些其他值,如
i/i或p/p
,它将允许,但转换的值不正确。我尝试了转换文件的相同数据,但其他非ebcdic的值仍存在于文件中convertedfile@Borodin,有些机器的字节顺序既不是小的,也不是大的。例如,我相信有一个将32位数字存储为3412
78563412