这是给老(呃)手的一个:-)
我正在从大型机 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 数据根据它们的长度读入 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,我在 buffer(1) 中得到 0,在 buffer(0) 中得到 3 - 很好。但是当两个字节为 00 20 时,我将 128 读入缓冲区(0)!
因此,在拉了半天的头发之后,我将编码器从流读取器声明中删除,现在我将 32 读入缓冲区(0),就像它应该的那样!!!
最重要的是,非标准代码页编码器弄乱了字节读数!!!
知道如何解决这个问题吗?