2009-10-30 2 views
1

FTP를 통해 AS/400에서 Windows (SBS 2003)로 파일을 전송하고 있습니다. 파일은 고정 폭 데이터입니다. 텍스트는 괜찮은 것처럼 보이지만 일부 필드는 압축 된 소수점입니다. 압축을 풀면 값이 잘못됩니다. 필자의 가정은 압축 된 바이트를 변환하는 EBCDIC-> ASCII 변환이 일어나고 있다는 것입니다. 그러나 역 변환을 수행하고 그것들을 풀면 은 여전히 ​​입니다. 때때로 값이 잘못됩니다.AS400 포장 십진수 (BCD) 포장 풀기 - EBCDIC 변환으로 borked 가능합니까?

내 생각에 그들이 사용하는 코드 페이지가 약간 다릅니다 (EBCDIC로 다시 변환 할 때 코드가 동일하지 않습니다). 그러나 어떤 코드 페이지인지 찾는 방법을 모릅니다. 입니다. IT 사람들은 다소 완화되고 있습니다. 그렇지 않으면 바이너리 모드에서 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) 
+0

변환을위한 코드를 작성하기 위해 어떤 언어를 사용하고 있습니까? 언어에 따라 다른 솔루션이 있습니다. – Jason

+0

아아, VB6 사용하고 있습니다. – Dave

+0

너무 늦어서 죄송합니다. 이게 해결 됐어? 그렇지 않은 경우 숫자 데이터의 성공 사례와 문제가있는 사례는 무엇입니까? (결과 중 일부만 좋지 않다고 ....) –

답변

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 
+0

우리는 라이센스를 가지고 있지 않습니다. 우리가 했더라도 코드 페이지를 결정하기 위해 시스템에 적극적으로 연결해야한다고 제안합니다. 우리는 (그리고하지 않을 것이다). – Dave

0

죄송 합니다만, iSeries FTP에 관해서는 VB에 대해 많이 알지 못합니다. iSeries FTP는 실제로 EBCDIC에서 ASCII 로의 자동 변환을 수행합니다. FTP는이를 위해 시스템 테이블 QEBCDIC 및 QASCII를 사용합니다. WRKTBL 명령을 사용하여이 테이블을 찾을 수 있습니다.

이 표의 값을 확인하고 파일과 일치하는지 확인하는 것이 좋습니다. 그렇지 않다면, 나는 VB에서 변환 작업도하고 있다고 생각하고있다.

중요 : 문제점이 iSeries에서 발생하면 다른 변환 세트 및 다른 문자 세트로 작업 할 수 있습니다. 이 값은 FTP 명령에서 변경할 수 있습니다 (iSeries에서 Windows로 또는 FTP 서버에서 허용되는 경우).

시스템 테이블 자체를 변경하면 안됩니다 (당신은 마음이 희미하지 않다.)이 테이블을 복사하고, 원하는대로 바꾸고,이 새로운 테이블을 가리킨다.

또한 FTP 세션에서 서버 측 명령을 연구하는 것은 가치가있다. 로컬 FTP 세션을 사용하면 iSeries에 많은 일을하도록 요청할 수 있습니다.이 명령은 표준 FTP 명령이 아니지만 AS/400 전용입니다.

희망이 있습니다.

1

예 Packed Decimal의 일부 바이트가 ASCII로 변환되기 때문에 EBCDIC - >> ASCII 변환으로 압축 된 십진수 필드가 엉망이됩니다.

여러 EBCDIC 문자가 단일 ASCII 문자에 매핑 될 수 있고 여러 ASCII 문자가 단일 EBCDIC 문자에 매핑 될 수 있으므로 EBCDIC - >> ASCII - >> ASCII가 작동하지 않는 것으로 나타났습니다. 일반적으로이 변환 오류는 압축 10 진수 필드에 표시되는 표시 문자가없는 경우 발생합니다.

해결책은 입니다. 1) AS400에서 포장을 풀고 을 사용하십시오. 2) 이진 전송을 수행하십시오. RecordEditor (http://record-editor.sourceforge.net/)를 사용하여 파일을 볼 수 있습니다.

참고 : EBCDIC의 경우 CP037 (코드 페이지 37 또는 사용하는 코드 페이지)을 사용하십시오. RecordEditor를 사용하면 포장 십진수 필드를 정의 할 수 있습니다. Cobol Copybook이있는 경우; 카피 북을 메인 프레임으로 가져 오기 시도 할 수 있습니다 카피 북 (가능할 수도 있습니다)