【问题标题】:Unpacking AS400 packed decimal (BCD) - possibly borked by EBCDIC conversion?解包 AS400 压缩十进制 (BCD) - 可能被 EBCDIC 转换搞砸了?
【发布时间】:2009-11-25 18:12:09
【问题描述】:

我正在通过 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)

【问题讨论】:

  • 您使用什么语言编写代码来转换它们?根据语言的不同,有不同的解决方案。
  • 抱歉这么晚收听;你解决了吗?如果不是,有哪些数字数据成功通过和一些有问题的例子? (你说只有部分结果不好......)

标签: ibm-midrange ebcdic bcd


【解决方案1】:

是的,EBCDIC -->> ASCII 转换将搞砸压缩十进制字段,因为压缩十进制中的一些字节将被转换为 ASCII。

正如您发现执行 EBCDIC -->> ASCII -->> ASCII 将不起作用,因为多个 EBCDIC 字符可以映射到单个 ASCII 字符,而多个 ASCII 字符可以映射到单个 EBCDIC 字符。通常,如果在压缩十进制字段中找不到显示字符,则会发生此转换错误。

解决方案是 1) 在 AS400 上解压并发送 2) 进行二进制传输。您可以使用 RecordEditor (http://record-editor.sourceforge.net/) 查看文件。然后,您应该能够将数据剪切并粘贴到文本编辑器等中。

注意:对于 EBCDIC,请使用 CP037(编码页 37 或您使用的任何编码页)。 RecordEditor 将允许您定义压缩十进制字段 如果您有 Cobol Copybook;您可以尝试将 Copybook 作为大型机导入 字帖(可能有用???)

【讨论】:

    【解决方案2】:

    尝试使用 Programmer's Toolkit(Access for Windows 的一部分)提供的可用于 VB 的转换例程和代码页查询与转换功能。

    这些是 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
    

    【讨论】:

    • 我们没有许可证 - 即使我们有,您的示例建议需要与他们的系统建立活动连接(以确定代码页),我们没有(并且不会) t)。
    【解决方案3】:

    抱歉,对 VB 了解不多,对 iSeries FTP 了解更多。 iSeries FTP 确实在进行从 EBCDIC 到 ASCII 的自动转换。 FTP 为此使用系统表 QEBCDIC 和 QASCII。您可以使用命令 WRKTBL 找到这些表。

    我建议您检查这些表中的值并检查它们是否与您的文件匹配。如果没有,我认为 VB 也在做一些转换。

    重要提示:如果问题出在 iSeries,那么您可以使用其他翻译表以及其他字符集。您可以在 FTP 命令中更改这些值(如果您从 iSeries 发送到 Windows,或 FTP 服务器(如果您被允许这样做)。

    你永远不应该做的是改变系统表本身(只有当你不是胆小...)。复制这些表,随意更改,然后指向这些新表。

    此外,研究 FTP 会话中的服务器端命令可能是值得的。从您的本地 FTP 会话中,您可以要求 iSeries 为您做很多事情。这些命令不是标准的 FTP 命令,而是特定于 iSeries 的。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多