我有一个来自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()函数以可读格式查看它。
答案 0 :(得分:3)
我无法帮助您解压缩这30个字节而不知道它们是如何打包的。你肯定有一些想法吗?
对于常规的EBCDIC文本,您需要准确确定文档使用的代码页,然后您只需使用Perl IO对其进行解码
假设您正在处理code page 37,那么您可以像这样打开文件
open my $fh, '<:encoding(cp37)', 'ebcdic_file' or die $!
然后您可以正常读取数据。它将作为Unicode字符检索
答案 1 :(得分:0)
这是一个疯狂的猜测,因为我既不知道您正在使用哪个EBCDIC代码页,也不知道如何打包30个字节。但它很有可能会做你想做的事情
请尝试运行此程序并告诉我们结果
{{1}}