我通过FTP将文件从AS / 400传输到我们的Windows(SBS 2003)。这些文件是固定宽度的数据。文本看起来很好,但是一些字段是压缩的小数,当解压缩时会给出错误的值。我的假设是发生了隐含的EBCDIC-> ASCII转换,它也转换了压缩字节。但是,进行反向转换并将它们解压缩仍然会产生错误值...有时候。
我的猜测是他们使用的代码页略有不同(所以当我转换回EBCDIC时它并不完全相同),但我不知道如何找出他们的代码页使用(他们的IT人员......有点顽固......否则他们只能在二进制模式下执行FTP并跳过所有这些问题。)
以下是一些示例数据 - 这些数据应该打包为8位数字,实际上是YYYYMMDD格式的日期。
Received:
2,0,216,202,164
2,0,144,22,177
2,0,16,176,172
2,0,16,176,172
2,0,16,176,172
2,0,16,176,172
1,114,176,160,124
2,0,248,32,63
2,0,144,226,164
2,0,144,226,164
2,0,144,226,164
2,0,144,202,124
2,0,144,202,124
2,0,144,176,172
2,0,144,176,172
2,0,32,22,63
2,0,38,248,172
2,0,38,248,172
2,0,38,98,164
2,0,233,1,15
2,0,45,107,172
1,114,176,226,26
1,114,176,38,177
1,114,176,97,164
2,0,0,17,124
2,0,128,129,31
2,0,128,129,31
2,0,128,129,31
2,0,128,129,31
2,0,128,129,31
2,0,128,129,31
2,0,216,17,63
2,0,160,17,31
2,0,160,128,34
2,0,160,129,26
2,0,38,128,31
2,0,38,144,26
1,114,97,16,124
1,114,97,16,124
2,0,38,234,26
2,0,38,201,172
2,0,45,38,124
2,0,45,216,164
2,0,45,107,177
2,0,248,234,124
2,0,248,202,34
2,0,248,18,172
2,0,97,128,172
2,0,248,18,7
2,0,248,233,15
2,0,201,2,15
2,0,176,16,7
2,0,106,0,31
2,0,216,22,34
2,0,216,160,63
2,0,38,107,7
2,0,233,0,63
2,0,38,107,164
2,0,233,0,26
2,0,38,107,34
2,0,233,0,164
2,0,233,17,15
2,0,45,202,177
2,0,45,106,7
2,0,45,97,177
2,0,47,16,31
2,0,248,216,177
2,0,201,0,172
2,0,176,201,63
2,0,248,97,34
2,0,176,202,26
2,0,248,97,34
2,0,201,2,172
2,0,201,17,164
2,0,176,129,164
2,0,201,17,172
2,0,176,144,7
2,0,145,2,164
2,0,32,145,15
2,0,38,45,26
2,0,38,38,63
2,0,38,233,26
2,0,38,248,34
2,0,45,202,164
2,0,45,107,124
2,0,47,17,15
2,0,47,16,31
2,0,47,130,34
2,0,248,45,177
2,0,106,0,31
2,0,248,22,31
2,0,248,202,172
2,0,248,97,172
2,0,47,128,177
2,0,201,2,164
2,0,216,201,164
2,0,176,16,34
2,0,216,201,34
这是转换回ebcdic的代码页,它不是完全工作:
ascii = Array( _
&H0, &H1, &H2, &H3, &H37, &H2D, &H2E, &H2F, &H16, &H5, &H25, &HB, &HC, &HD, &HE, &HF, _
&H10, &H11, &H12, &H13, &H3C, &H3D, &H32, &H26, &H18, &H19, &H3F, &H27, &H1C, &H1D, &H1E, &H1F, _
&H40, &H4F, &H7F, &H7B, &H5B, &H6C, &H50, &H7D, &H4D, &H5D, &H5C, &H4E, &H6B, &H60, &H4B, &H61, _
&HF0, &HF1, &HF2, &HF3, &HF4, &HF5, &HF6, &HF7, &HF8, &HF9, &H7A, &H5E, &H4C, &H7E, &H6E, &H6F, _
&H7C, &HC1, &HC2, &HC3, &HC4, &HC5, &HC6, &HC7, &HC8, &HC9, &HD1, &HD2, &HD3, &HD4, &HD5, &HD6, _
&HD7, &HD8, &HD9, &HE2, &HE3, &HE4, &HE5, &HE6, &HE7, &HE8, &HE9, &H4A, &HE0, &H5A, &H5F, &H6D, _
&H79, &H81, &H82, &H83, &H84, &H85, &H86, &H87, &H88, &H89, &H91, &H92, &H93, &H94, &H95, &H96, _
&H97, &H98, &H99, &HA2, &HA3, &HA4, &HA5, &HA6, &HA7, &HA8, &HA9, &HC0, &H6A, &HD0, &HA1, &H7, _
&H20, &H21, &H22, &H23, &H24, &H15, &H6, &H17, &H28, &H29, &H2A, &H2B, &H2C, &H9, &HA, &H1B, _
&H30, &H31, &H1A, &H33, &H34, &H35, &H36, &H8, &H38, &H39, &H3A, &H3B, &H4, &H14, &H3E, &HE1, _
&H41, &H42, &H43, &H44, &H45, &H46, &H47, &H48, &H49, &H51, &H52, &H53, &H54, &H55, &H56, &H57, _
&H58, &H59, &H62, &H63, &H64, &H65, &H66, &H67, &H68, &H69, &H70, &H71, &H72, &H73, &H74, &H75, _
&H76, &H77, &H78, &H80, &H8A, &H8B, &H8C, &H8D, &H8E, &H8F, &H90, &H9A, &H9B, &H9C, &H9D, &H9E, _
&H9F, &HA0, &HAA, &HAB, &HAC, &HAD, &HAE, &HAF, &HB0, &HB1, &HB2, &HB3, &HB4, &HB5, &HB6, &HB7, _
&HB8, &HB9, &HBA, &HBB, &HBC, &HBD, &HBE, &HBF, &HCA, &HCB, &HCC, &HCD, &HCE, &HCF, &HDA, &HDB, _
&HDC, &HDD, &HDE, &HDF, &HEA, &HEB, &HEC, &HED, &HEE, &HEF, &HFA, &HFB, &HFC, &HFD, &HFE, &HFF)
答案 0 :(得分:1)
是EBCDIC - >> ASCII转换将搞乱压缩十进制字段,因为Packed Decimal中的某些字节将转换为ASCII。
当你发现做EBCDIC时 - >> ASCII - >> ASCII将无法工作,因为多个EBCDIC字符可以映射到单个ASCII字符,并且多个ASCII字符可以映射到单个EBCDIC字符。通常,这种转换错误发生在您将在压缩十进制字段中找不到的显示字符。
解决方案是 1)在AS400上打开包装并转发 2)进行二元转移。您可以使用RecordEditor(http://record-editor.sourceforge.net/)来查看文件。然后,您应该能够将数据剪切并粘贴到文本编辑器等中。
注意:对于EBCDIC,请使用CP037(编码第37页或您使用的任何编码页面)。 RecordEditor将允许您定义压缩十进制字段 如果你有Cobol Copybook;您可以尝试将The Copybook导入为大型机 字帖(可能有效)?
答案 1 :(得分:0)
尝试使用转化例程和代码页查询&程序员工具包提供的VB可用的转换函数,是Access for Windows的一部分。
这些是ActiveX对象。用VB不太难。
(long) AS400System.HostCodePage // tells you the host's code page
(object) PackedConverter // convert between numeric strings and byte arrays
(object) CodePageConverter // convert text data between iSeries and PC code pages
答案 2 :(得分:0)
抱歉,对VB不太了解,更多关于iSeries FTP的知识。 iSeries FTP确实在从EBCDIC到ASCII进行自动转换。 FTP正在使用系统表QEBCDIC和QASCII。您可以使用命令WRKTBL找到这些表。
我建议您检查这些表中的值,并检查它们是否与您的文件匹配。如果没有,我认为VB也在做一些转换。
重要提示:如果问题出在iSeries上,那么您可以使用其他转换表以及其他字符集。您可以在FTP命令中更改这些值(如果从iSeries发送到Windows或FTP服务器(如果允许这样做)。
你永远不应该做的是改变系统表本身(只有当你不是胆小的时候......)。复制这些表,更改您想要的任何内容,并指向这些新表。
此外,研究FTP会话中的服务器端命令可能值得。从您本地的FTP会话中,您可以要求iSeries为您做很多事情。这些命令不是标准FTP命令,而是特定于iSeries。
希望这有帮助。