Как распаковать маленький или большой порядок байтов в 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