EBCDIC CHARを六角値に変換する(AFP EBCDICデータ)
質問
私はいくつかのeBCDICデータを使用して作業しています。これは、解析してヘックス値を見つける必要があります。私が抱えている問題は、間違ったエンコードでファイルを読んでいるように見えるということです。私の記録が始まることがわかります」!
" (これは x5A
EBCDICで)しかし、16進体に変換すると、 x21
, 、これはAの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
ありがとう!
解決
はい、文字列としてテキストデータを読むと、Unicodeとして内部に保存されています。あなたが気にかけているなら バイナリ 値(つまり、生のバイト)は、そもそもそれをデコードしないでください。
カスタムEBCDICエンコードで本当に何かをする必要がある場合は、私を使用できます オープンソースEBCDIC実装 - しかし、私はあなたがこれをバイナリデータまたはテキストとして扱っているかどうかについて、本当にあなたの心を補う必要があると思います。
他のヒント
あなたはこのようにそれをすることができます:
- AFPファイルを開きます。最初の9バイトを読んでください。
- バイト0は0xd3または0x5aである必要があります。バイト1とバイト2は、読んだばかりの9バイトのうち8つを含むSFIの長さです。それは大きなエンディアンなので、長さ= byte1 * 256+byte2です。
- バイト3、4、および5は、構造化されたフィールド識別子です。印刷可能なテキストを探している場合は、PTX(プレゼンテーションテキスト要素)0xd3 0xee 0x9bを探してください。長さ8を前にスキップし、見つからなかった場合は次の9バイトを読んでください。
- PTXを見つけた場合は、長さ8バイトを読み取ります。テキストに到達するためにコントロールシーケンスを解析するのは少し難しいです。最初は0x2b 0xd3で始まり、長さのバイト、バイトの制御シーケンスの種類があります。このバイトが奇数の場合、次の制御シーケンスは、代わりに長さバイトから始まる0x2B 0xD3ヘッダーを省略します。これは「チェーン」と呼ばれ、このようなものを非常識に解析しようとするプログラマーを駆動するために導入されたようです。
- 長さのバイトの長さ1から前にスキップして、次の0x2b 0xd3を押すか、単に探します。最後の制御シーケンスはチェーンされず、PTXの終わりに続くものはすべてEBCDICになります。 Jon Skeetのライブラリ(ありがとう、Jon)を使用し、次のPTX要素を探します。
申し訳ありませんが、私は長い間ワインドでした。実行可能ですが、単純ではありません。
AFPデータをそのように注意してください。それはバイトとビットの両方の順序でビッグエンディアンです。ドキュメント内の構造化されたフィールドを解析するなど、バイナリデータとして扱う場合は、それを説明する必要があります。
所属していません StackOverflow