Como ler dados EBCDIC com uma página de códigos não padrão e não bagunçar números?

Aqui está um para os velhos (er) mãos :-)

Estou lendo um despejo binário de uma tabela do mainframe DB2. A tabela possui colunas varchar, char, smallint, integer e float. Para torná-lo interessante, o DB2 usa a página de código 424 (hebraico). Eu preciso que meu código seja independente da página de códigos.

Então, abro o arquivo com um leitor de stream usando System.Text.Encoding da seguinte forma:

Dim encoding As System.Text.Encoding = System.Text.Encoding.GetEncoding(20424)
Dim sr As New StreamReader(item.Key, encoding)

e continue a ler os dados VARCHAR e CHAR de acordo com seus comprimentos em matrizes de caracteres usando

sr.ReadBlock(buffer, 0, iFieldBufferSize)

Sempre lembrar os 2 primeiros bytes em uma coluna VARCHAR deve ser descartado e obter a sequência correta com

SringValue = encoding.GetString(encoding.GetBytes(buffer))

E tudo é ótimo!

Mas agora chego à coluna SMALLINT e estou com problemas. O valor do número assinado é armazenado em 2 bytes e, como seu Big Endian, eu faço

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)

e eu recebo números errados! por exemplo, se os bytes forem 00 03, recebo 0 no buffer (1) e 3 no buffer (0) - bom. Mas quando os dois bytes são 00 20, recebo 128 lidos no buffer (0)!

Então, depois de meio dia puxando meu cabelo, larguei o codificador da declaração do leitor de fluxo e agora estou recebendo 32 leituras no buffer (0), como deveria ser !!!

Resumindo, o codificador de página de código não padrão atrapalha as leituras de bytes !!!

Alguma idéia de como contornar isso?

questionAnswers(3)

yourAnswerToTheQuestion