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表現を取得します。
を伝え、それ以外の場合は誰がためにしようとすることはできないだろうしてくださいやりたいだろうというスリムなチャンスがあります君は。すでに試した実際のコードも含める必要があります。 [編集]の質問とそれを追加してください。 – simbabque
機密性のためにデータを含めることはできません。しかし、私はPerlとPHPの両方で使用したコードを提供することができます。 – user3472277