0

我正在使用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;

我在这个链接中得到了这个脚本

当 EBCDIC 数据包含Little Endian 或 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)

有什么建议么 ?

4

1 回答 1

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
于 2015-02-25T09:00:06.773 回答