我正在使用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)
有什么建议吗?
答案 0 :(得分:0)
您是否意识到所有多字节二进制数必须是小端还是大端?
我认为你想要反转字节顺序的i
/ I
或s
/ 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