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!

War es hilfreich?

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:

  1. Öffnen Sie die AFP -Datei. Lesen Sie die ersten 9 Bytes.
  2. 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.
  3. 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.
  4. 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.
  5. Ü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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top