¿Cómo leer los datos EBCDIC con una página de códigos no estándar y no confundir los números?

Aquí hay una para las viejas manos: -)

Estoy leyendo un volcado binario de una tabla de mainframe de DB2. La tabla tiene columnas varchar, char, smallint, integer y float. Para hacerlo interesante, DB2 utiliza la página de códigos 424 (hebreo). Necesito que mi código sea independiente de la página de códigos.

Así que abro el archivo con un lector de flujo usando System.Text.Encoding así:

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

y proceda a leer los datos VARCHAR y CHAR según sus longitudes en matrices de caracteres utilizando

sr.ReadBlock(buffer, 0, iFieldBufferSize)

Siempre recordando los primeros 2 bytes en una columna VARCHAR debe descartarse y obtener la cadena correcta con

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

¡Y todo es genial!

Pero ahora llego a la columna SMALLINT, y estoy en problemas. El valor del número firmado se almacena en 2 bytes, y debido a que es Big endian, hago

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)

@ y obtengo números equivocados! por ejemplo, si los bytes son 00 03 obtengo 0 en el búfer (1) y 3 en el búfer (0) - bien. ¡PERO cuando los dos bytes son 00 20, obtengo 128 lecturas en el búfer (0)!

Así que, después de medio día de tirar de mi cabello, dejo caer el codificador de la declaración de streamreader, ¡y ahora estoy leyendo 32 en el búfer (0), como debería ser!

Bottom line, ¡el codificador de página de códigos no estándar desordena las lecturas de bytes!

¿Alguna idea de como solucionar esto

Respuestas a la pregunta(3)

Su respuesta a la pregunta