옛날 사람의 손 :-)숫자가 엉망이 아닌 비표준 코드 페이지로 EBCDIC 데이터를 읽는 방법?
메인 프레임 DB2 테이블에서 바이너리 덤프를 읽습니다. 이 테이블에는 varchar, char, smallint, integer 및 float 열이 있습니다. 흥미롭게 만들기 위해 DB2는 코드 페이지 424 (히브리어)를 사용합니다. 코드를 독립적으로 사용하려면 코드가 필요합니다.
그래서 나는과 같이 System.Text.Encoding을 사용하여 위해 StreamReader로 파일을 엽니 다
Dim encoding As System.Text.Encoding = System.Text.Encoding.GetEncoding(20424)
Dim sr As New StreamReader(item.Key, encoding)
및 사용하여 문자 배열에 자신의 길이에 따라 VARCHAR와 CHAR 데이터를 읽을 진행
sr.ReadBlock(buffer, 0, iFieldBufferSize)
VARCHAR 열의 처음 2 바이트는 항상 을 버리고 올바른 문자열을
SringValue = encoding.GetString(encoding.GetBytes(buffer))
과 함께 가져와야합니다.
그리고 모두 훌륭합니다!
하지만 이제 SMALLINT 열에 도착하고 문제가 있습니다. 서명 된 숫자의 값은 2 바이트로 저장되고 빅 엔디안이기 때문에 내가 수행합니다.
Dim buffer(iFieldBufferSize - 1) As Byte
buffer(1) = sr.Read ''switch the bytes around!
buffer(0) = sr.Read
Dim byteBuffer(iFieldBufferSize - 1) As Byte
Dim i16 As Int16 = BitConverter.ToUInt16(buffer, 0)
잘못된 숫자가 표시됩니다. 예를 들어, 바이트가 00 03이라면 버퍼 (1)에서는 0, 버퍼 (0)에서는 3이됩니다. 하지만 두 바이트가 00 20 일 때, 나는 128 개의 버퍼를 버퍼 (0)에 넣는다!
그래서 머리카락을 당기는 반나절 후, 나는 streamreader 선언에서 인코더를 떨어 뜨린다. 이제 버퍼가 32가되어야한다.
결론적으로, 비표준 코드 페이지 인코더는 바이트 판독 값을 엉망으로 만듭니다 !!!
이 문제를 해결하는 방법에 대해 알고 싶습니다.
Nicholas, 놀라 울 정도로 도움이되었습니다! FLOAT에 대한 도우미 메서드를 추가 할 정도로 친절 할 수 있습니까? FLOAT (53) 컬럼이 여러 개 있습니다. – GilShalit
플로트는 다소 어렵습니다. IBM 메인 프레임은 IEEE 754를 사용하지 않습니다. 이들은 IEEE 754 이전의 기본 16 기반 부동 소수점 형식을 사용합니다. Microsoft는 http://support.microsoft.com/kb/235856에서 일부 코드가있는 KB 기사를 가지고 있습니다. 또한 IBM의 [i] Principles of Operation [/ i]을보십시오. http://www.hack.org/mc/texts/principles-of-operation.pdf에서 구 버전을 얻고 http://www-01.ibm.com/support/docview에서 IBM의 최신 버전을 구하십시오. .wss? uid = isg2b9de5f05a9d57819852571c500428f9a (하지만 IBM에 등록해야합니다). –
니클라스, 내일은 이것들을 보겠습니다 ... 고맙습니다! – GilShalit