2009-04-13 16 views
1

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

フレームワークに組み込みメソッドがあることを期待していましたが、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 

ありがとうございます!

答えて

3

はい、文字列としてテキストデータを読み込むと、内部的にUnicodeとして格納されます。 バイナリの値(生のバイト)を気にしている場合は、最初にそれをデコードしないでください。

カスタムEBCDICエンコーディングで本当に何かをする必要があるなら、私のopen source EBCDIC implementationを使うことができます。しかし、これをバイナリデータやテキストとして扱っているかどうかは本当に分かります。

3

AFPデータを注意深く読んでください。バイトオーダーとビットオーダーの両方でビッグエンディアンです。ドキュメントの構造化フィールドを解析するなど、バイナリデータとして扱う場合は、そのことを考慮する必要があります。あなたはこのようにそれを行うことができます

+0

構造化フィールドのデータは、私が得ようとしているものです。入力をありがとう –

4

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

申し訳ありません申し訳ありません。それは実行可能ですが、単純ではありません。

関連する問題