2016-09-29 3 views
1

IBMメインフレームソースのEBCDICエンコードデータファイルを解析し、ASCIIに変換する必要があります。私は16進数で1バイトごとにそれを読み取って変換し、対応する一致をASCIIで探すことができました。IBMデータファイルのフィールドを展開します

私の問題は、EBCDICでエンコードされたファイルには30バイトがパックされており、実際の値を取得するために解凍する必要があるということです。私はPHPのパック/アンパック機能とPerlの使い方を試していますが、運がないことを発見しました。私が得ている価値は、私が探している正確な価値ではないようです。私はC c h h Nでアンパックしようとしました。

ファイルにEBCDICでエンコードされたデータが格納されていると仮定します。 パックフィールドは位置635から664まで、30バイトの長 DATA1 = 9バイト DATA2 = 9バイト DATA3 = 3バイト DATA4 = 3バイト DATA5 = 3バイト DATA6 = 3バイト

PHPにある:

 
    $datafile = fopen("/var/www/data/datafile", "rb");
    $regebcdicdata = fread($datafile, 634); 
    $packfields = fread($datafile, 30); 
    $arr= unpack('c9data1/c9bdata2/c3data3/C3data4/C3data5/C3data6',$packfields); 
    print_r($arr); 
PERL:
 
    open my $fh, '<:raw', '/var/www/html/PERL/test'; 
    my $bytes_read = read $fh, my $bytes, 634; 
    my $bytes_read2 = read $fh, my $bytes2, 30; 
    my ($data1,$data2,$data3,$data4,$data5,$data6) = unpack 'C9 C9 C3 C3 C3 C3',  $bytes2; 

UPDATE: はすでに解決策を見つけました。これらの30バイトは指定されたフォーマットでパックされていました。だから私はPHPのアンパック機能を使って解凍します。

EBCDIC変換用。私はバイトごとにそれを読んで、bin2hex()関数を使って16進数の値を取得し、一致するASCII 16進値を見つけて、ユーザーがchr()関数を使って読み込み可能な形式でそれを見ることができるようにASCII表現を取得します。

https://www.ibm.com/support/knowledgecenter/SSZJPZ_11.3.0/com.ibm.swg.im.iis.ds.parjob.adref.doc/topics/r_deeadvrf_ASCII_and_EBCDIC_Conversion_Tables.htmlで変換表を使用しました。

+0

を伝え、それ以外の場合は誰がためにしようとすることはできないだろうしてくださいやりたいだろうというスリムなチャンスがあります君は。すでに試した実際のコードも含める必要があります。 [編集]の質問とそれを追加してください。 – simbabque

+0

機密性のためにデータを含めることはできません。しかし、私はPerlとPHPの両方で使用したコードを提供することができます。 – user3472277

答えて

3

パッキング方法を知らなくても、30バイトの解凍をお手伝いすることはできません。確かにあなたはあるアイデアを持っている必要がありますか?

通常のEBCDICテキストとして、あなたはあなたの文書が使用しています正確にどのコードページを確立する必要があり、その後、あなたは、単に

はあなたがcode page 37を扱っている、あなたはあなたのを開くことができると仮定し、それをデコードするPerlのIOを使用することができますこのようなファイル

open my $fh, '<:encoding(cp37)', 'ebcdic_file' or die $! 

通常のようにデータを読み取ることができます。これはUnicode文字として取得されます

+0

素晴らしい!ありがとう。ですから、私はこのデータがどのように詰まっているかをチェックする必要があります。私は使用したコードで投稿を編集しました。私はそれを正しい方法でやっていますか? – user3472277

+0

@ user3472277 Borodinが言っていることは、実際に詰め込まれていないためにデータが何であるかを知っていれば、アンパックする必要はないということです。それがどのエンコーディングであるかを調べると、Perlは自動的にそれを読むことができます。 – simbabque

+0

@simbabque:OPのコードから、634バイトのEBCDICエンコードされた文字の後に30バイトの何かがあるように見えます。それが本当に詰まっているかどうかは私には分かりません。 – Borodin

0

使用しているEBCDICコードページも30バイトのパックもわかっていないので、これは野生のものです。しかし、それはあなたが

このプログラムを実行してみてください、私達にあなたがデータを含める必要が結果

use strict; 
use warnings 'all'; 
use feature 'say'; 

my @data = do { 
    open my $fh, '<:encoding(cp37)', '/var/www/html/PERL/test' or die $!; 
    local $/; 
    my $data = <$fh>; 
    unpack '@634 A9 A9 A3 A3 A3 A3', $data; 
}; 

say for @data; 
関連する問題