これは古い(古い)手のためのものです:-)
メインフレーム 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 の場合、バッファ (1) で 0 を取得し、バッファ (0) で 3 を取得します。しかし、2 バイトが 00 20 の場合、128 が buffer(0) に読み込まれます!
髪を引っ張って半日後、ストリームリーダー宣言からエンコーダーを削除すると、32 がバッファー (0) に読み込まれます。
要するに、非標準のコードページエンコーダーはバイトの読み取りを台無しにします!!!
これを回避する方法はありますか?