Konvertieren von Ebcdic char in HEX -Werte (AFP EBCDIC -Daten)
Frage
Ich arbeite mit einigen EBCDIC -Daten, die ich analysieren und einige Hex -Werte finden muss. Das Problem, das ich habe, ist, dass ich die Datei mit der falschen Codierung lese. Ich kann sehen, dass meine Platte mit "beginnt"!
" (die ein x5A
in ebcdic), aber wenn die Konvertierung in Hex durchgeführt wird, kehrt es als a zurück x21
, was der ASCII -Wert für a "ist"!
".
Ich hatte gehofft, dass es eine integrierte Methode im Framework gab, aber ich befürchte, dass ich eine benutzerdefinierte Klasse erstellen muss, um das Ebcdic-Zeichensatz korrekt zuzuordnen.
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
Vielen Dank!
Lösung
Ja, wenn Sie die Textdaten als Zeichenfolgen lesen, speichert sie sie intern als Unicode. Wenn Sie sich um die kümmern binär Werte (dh die rohen Bytes) dekodieren es dann nicht überhaupt nicht.
Wenn Sie wirklich etwas mit einer benutzerdefinierten Ebcdic -Codierung tun müssen, können Sie meine verwenden Open Source Ebcdic Implementierung - Aber ich denke, Sie müssen sich wirklich entscheiden, ob Sie dies als binäre Daten oder Text behandeln.
Andere Tipps
Sie können es so machen:
- Öffnen Sie die AFP -Datei. Lesen Sie die ersten 9 Bytes.
- Byte 0 sollte 0xD3 oder 0x5a sein. Byte 1 und Byte 2 sind die Länge des SFI, einschließlich 8 der 9 Bytes, die Sie gerade gelesen haben. Es ist großer Endian, also die Länge = Byte1 * 256+Byte2.
- Bytes 3, 4 und 5 ist die strukturierte Feldkennung. Wenn Sie nach druckbarem Text suchen, suchen Sie nach PTX (Präsentationstextelement) 0xD3 0xee 0x9b. Überspringen Sie Vorwärtslänge-8 und lesen Sie die nächsten 9 Bytes, wenn Sie es nicht gefunden haben.
- Wenn Sie eine PTX gefunden haben, lesen Sie Länge-8-Bytes. Das Analysieren der Steuersequenzen, um in den Text zu gelangen, ist etwas schwierig. Der erste beginnt mit 0x2b 0xd3, einem Byte für die Länge und Byte für welche Art von Kontrollsequenz es ist. Wenn dieses Byte eine ungerade Zahl ist, stellt die nächste Steuersequenz den 0x2b 0xD3 -Header aus, beginnend mit dem Längen -Byte. Dies wird als "Verkettung" bezeichnet und wurde anscheinend vorgestellt, um Programmierer zu treiben, die versuchen, dieses Zeug verrückt zu analysieren.
- Überspringen Sie die Länge Byte Länge-1 und drücken Sie auf oder suchen Sie einfach nach dem nächsten 0x2b 0xD3; Die letzte Kontrollsequenz wird nicht gekettet, und alles, was bis zum Ende des PTX folgt, ist ebcdic. Verwenden Sie die Bibliothek von Jon Skeets (danke, Jon) und suchen Sie nach dem nächsten PTX -Element.
Entschuldigung, ich war langeatme. Es ist machbar, aber nicht einfach.
Seien Sie sorgfältig AFP -Daten auf diese Weise. Es ist sowohl in Byte als auch in Bit-Reihenfolge Big-Endian. Sie müssen dies berücksichtigen, wenn Sie es als Binärdaten behandeln, z. B. das Parsen durch die strukturierten Felder in einem Dokument.