Perl 如何在Convert::IBM390中解包little或big-endian
我正在使用将EBCDIC文件转换为ASCII文件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
#!/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