Вот один для старых (эр) рук :-)
Я читаю двоичный дамп из таблицы DB2 мейнфрейма. В таблице есть столбцы varchar, char, smallint, integer и float. Чтобы было интересно, DB2 использует кодовую страницу 424 (иврит). Мне нужно, чтобы мой код был независимым от кодовой страницы.
Итак, я открываю файл с помощью потокового чтения, используя System.Text.Encoding следующим образом:
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)
Всегда помнить, что первые 2 байта в столбце VARCHAR следует отбросить и получить правильную строку с помощью
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, я получаю 0 в буфере (1) и 3 в буфере (0) - хорошо. НО, когда два байта равны 00 20, я получаю 128, прочитанных в буфер (0)!
Итак, после полдня дергания за волосы, я удаляю кодировщик из объявления streamreader, и теперь я получаю 32 чтения в буфер (0), как и должно быть!!!
Суть в том, что нестандартный кодировщик кодовой страницы искажает показания байтов !!!
Любая идея, как обойти это?