1

いくつかの EBCDIC データを解析して、いくつかの Hex 値を見つける必要があります。私が抱えている問題は、間違ったエンコーディングでファイルを読み込んでいるように見えることです。!レコードが " " ( x5AEBCDIC では a) で始まっていることがわかりますが、 16 進数に変換するx21と、" " の ASCII 値であるとして返されます!

フレームワークに組み込みメソッドがあることを期待していましたが、EBCDIC 文字セットを正しくマップするためにカスタム クラスを作成する必要があるのではないかと心配しています。

Using fileInStream As New FileStream(inputFile, FileMode.Open, FileAccess.Read)
   Using bufferedInStream As New BufferedStream(fileInStream)
      Using reader As New StreamReader(bufferedInStream, Encoding.GetEncoding(37))
         While Not reader.EndOfStream
            Do While reader.Peek() >= 0
               Dim charArray(52) As Char
               reader.Read(charArray, 0, charArray.Length)

               For Each letter As Char In charArray
                  Dim value As Integer = Convert.ToInt16(letter)

                  Dim hexOut As String = [String].Format("{0:x}", value)
                  Debug.WriteLine(hexOut)
               Next
            Loop
         End While
      End Using
   End Using
End Using

ありがとう!

4

3 に答える 3

4

次のように実行できます。

  1. AFP ファイルを開きます。最初の 9 バイトを読み取ります。
  2. バイト 0 は 0xD3 または 0x5A にする必要があります。バイト 1 とバイト 2 は、読み取った 9 バイトのうち 8 バイトを含む SFI の長さになります。ビッグ エンディアンなので、長さ = バイト 1 * 256 + バイト 2 です。
  3. バイト 3、4、および 5 は構造化フィールド識別子です。印刷可能なテキストを探している場合は、PTX (プレゼンテーション テキスト要素) 0xD3 0xEE 0x9B を探します。見つからなかった場合は、長さ 8 をスキップして次の 9 バイトを読み取ります。
  4. PTX が見つかった場合は、長さ 8 バイトを読み取ります。制御シーケンスを解析してテキストに到達するのは、少しトリッキーです。1 つ目は 0x2b 0xD3 で始まり、長さのバイト、および制御シーケンスの種類のバイトです。このバイトが奇数の場合、次の制御シーケンスは 0x2B 0xD3 ヘッダーを省略し、代わりに長さバイトから開始します。これは「連鎖」と呼ばれ、どうやらこのようなものを解析しようとするプログラマーを狂わせるために導入されたようです。
  5. 長さバイト length-1 から先にスキップして、次の 0x2B 0xD3 を押すか、単に探します。最後の制御シーケンスは連鎖されず、PTX の最後に続くすべてが EBCDIC になります。Jon Skeet のライブラリ (ありがとう、Jon) を使用して、次の PTX 要素を探します。

長々とすみません。実行可能ですが、単純ではありません。

于 2009-04-14T14:30:47.150 に答える
3

はい、テキスト データを文字列として読み取ると、内部的に Unicode として保存されます。バイナリ値 (つまり生のバイト)が気になる場合は、最初からデコードしないでください。

カスタム EBCDIC エンコーディングで本当に何かをする必要がある場合は、私のオープン ソース EBCDIC 実装を使用できますが、これをバイナリ データとテキストのどちらとして扱うかを決める必要があるだけだと思います。

于 2009-04-13T16:59:24.883 に答える