Как распаковать маленький или большой порядок байтов в Convert::IBM390

Я использую 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 или 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 ответ

Вы понимаете, что все многобайтовые двоичные числа должны иметь младший или старший порядок?

Я предполагаю, что это 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
Другие вопросы по тегам