Вот один для старых (er) рук: -)
Я читаю двоичный дамп из таблицы 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))
И все отлично!
Но теперь я доберусь до МАЛЕНЬКОГО столбца, и у меня проблемы. Значение числа со знаком хранится в 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)!
Итак, после полдня, потянув меня за волосы, я убрал кодировщик из объявления потокового читателя, и теперь я получаю 32 считывания в буфер (0), как и должно быть !!!
Суть в том, что нестандартный кодировщик кодовых страниц портит показания байтов !!!
Есть идеи как обойти это?