1

FTP 経由で AS/400 から Windows (SBS 2003) にファイルを転送しています。ファイルは固定幅データです。テキストは正常に表示されますが、一部のフィールドはパック 10 進数であり、アンパックすると不適切な値になります。私の推測では、暗黙の EBCDIC->ASCII 変換が発生しており、パックされたバイトも変換されています。ただし、逆の変換を行ってそれらを解凍すると、依然として悪い値が返されます...時々。

私の推測では、彼らが使用しているコードページはわずかに異なっています (したがって、EBCDIC に戻すと、まったく同じではありません)。 .やや反抗的...それ以外の場合は、バイナリ モードで FTP を実行し、これらの問題をすべてスキップできます)。

ここにいくつかのサンプル データがあります - これらは、実際には YYYYMMDD 形式の日付である 8 桁の数字に展開されることになっています。

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)
4

3 に答える 3

1

はい、EBCDIC -->> ASCII 変換はパック 10 進数フィールドを台無しにします。これは、パック 10 進数の一部のバイトが ASCII に変換されるためです。

EBCDIC -->> ASCII -->> ASCII を実行すると、複数の EBCDIC 文字が単一の ASCII 文字にマップされ、複数の ASCII 文字が単一の EBCDIC 文字にマップされる可能性があるため、機能しません。通常、この変換エラーは、パック 10 進数フィールドにある表示文字がない場合に発生します。

解決策は、1) AS400 と trnsmit で展開し、2) バイナリ転送を実行します。RecordEditor ( http://record-editor.sourceforge.net/ ) を使用してファイルを表示できます。その後、データをテキスト エディターなどにカット アンド ペーストできるようになります。

注: EBCDIC の場合、CP037 (コード化ページ 37 または使用するコード化ページ) を使用します。COBOL コピーブックがある場合、RecordEditor を使用してパック 10 進数フィールドを定義できます。The Copybook をメインフレームのコピーブックとしてインポートしてみてください (動作する可能性があります???)

于 2009-11-25T10:12:09.683 に答える
0

申し訳ありませんが、VB についてはあまり詳しくありません。iSeries FTP についてはもっと詳しく知っています。実際、iSeries FTP は EBCDIC から ASCII への自動変換を行っています。FTP は、このためにシステム テーブル QEBCDIC および QASCII を使用します。これらのテーブルは、コマンド WRKTBL で見つけることができます。

これらの表の値を確認し、それらがファイルと一致することを確認することをお勧めします。そうでない場合は、VB も何らかの変換を行っていると考えています。

重要: 問題が iSeries にある場合は、他の変換テーブルや別の文字セットを使用できます。これらの値は、FTP コマンド (iSeries から Windows に送信する場合) または FTP サーバー (許可されている場合) で変更できます。

絶対にすべきでないことは、システム テーブル自体を変更することです (気弱でない場合のみ...)。これらのテーブルをコピーし、必要に応じて変更して、これらの新しいテーブルをポイントします。

また、FTP セッションでサーバー側のコマンドを調べることも価値があるかもしれません。ローカル FTP セッションから、iSeries に多くのことを依頼できます。これらのコマンドは標準の FTP コマンドではなく、iSeries 固有のものです。

お役に立てれば。

于 2009-11-20T13:29:27.373 に答える
0

Access for Windows の一部である Programmer's Toolkit によって提供される 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
于 2009-10-31T20:16:32.977 に答える