从IBM数据文件中解压缩字段

时间:2016-09-29 11:24:59

标签: perl unpack ebcdic

我有一个来自IBM大型机源的EBCDIC编码数据文件,需要解析并转换为ASCII。我能够通过以十六进制读取每个字节来转换,并在ASCII上查找相应的匹配。

我的问题是,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;
    

更新: 已经找到了解决方案。这30个字节以指定的格式打包。所以我只是使用PHP unpack函数解压缩。

用于EBCDIC转换。我每个字节读取它,使用bin2hex()函数获取十六进制值,找到匹配的ASCII十六进制值并获得ASCII表示,以便用户可以使用chr()函数以可读格式查看它。

我在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使用了转换表。

2 个答案:

答案 0 :(得分:3)

我无法帮助您解压缩这30个字节而不知道它们是如何打包的。你肯定有一些想法吗?

对于常规的EBCDIC文本,您需要准确确定文档使用的代码页,然后您只需使用Perl IO对其进行解码

假设您正在处理code page 37,那么您可以像这样打开文件

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

然后您可以正常读取数据。它将作为Unicode字符检索

答案 1 :(得分:0)

这是一个疯狂的猜测,因为我既不知道您正在使用哪个EBCDIC代码页,也不知道如何打包30个字节。但它很有可能会做你想做的事情

请尝试运行此程序并告诉我们结果

{{1}}