Question

Je travaille avec des données EBCDIC que je dois analyser et trouver des valeurs Hex. Le problème que je vais avoir est qu'il semble que je lis le fichier avec l'encodage incorrect. Je peux voir que mon disque commence par « ! » (qui est un x5A en EBCDIC) mais en faisant la conversion en hexadécimal retourne en tant que x21, qui est la valeur ASCII pour une « ! ».

J'espérais qu'il y avait une méthode intégrée dans le cadre, mais je crains que je vais devoir créer une classe personnalisée pour cartographier correctement le jeu de caractères 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

Merci!

Était-ce utile?

La solution

Oui, quand vous lisez les données de texte en tant que chaînes, il est le stockage en interne comme Unicode. Si vous vous souciez de binaire valeurs (à savoir les octets bruts) alors ne décode pas en premier lieu.

Si vous avez vraiment besoin de faire quelque chose avec un codage EBCDIC personnalisé, vous pouvez utiliser mon ouverte la mise en œuvre - mais je pense que vous avez vraiment besoin de faire votre esprit si vous traitez cela comme des données binaires ou du texte

.

Autres conseils

Vous pouvez le faire comme ceci:

  1. Ouvrez le fichier AFP. Lire les 9 premiers octets.
  2. 0 octet doit être 0xD3 ou 0x5A. Octet 1 octet et 2 sera la longueur de la SFI, dont 8 des 9 octets que vous venez de lire. Il est grand endian, donc la longueur = byte1 * 256 + octet2.
  3. Octets 3, 4 et 5 est le champ structuré Identifier. Si vous êtes à la recherche du texte à imprimer, rechercher PTX (Texte de présentation Element) 0xD3 0xEE 0x9B. Passer longueur d'avance 8 et lisez les 9 octets suivants si vous ne trouvez pas.
  4. Si vous avez trouvé un PTX, lisez longueur 8 octets. À travers les séquences Parsing de contrôle pour obtenir le texte est un peu délicat. Le premier commencera par 0x2B 0xD3, un octet pour la longueur et octet pour ce type de séquence de contrôle est. Si cet octet est un nombre impair, la prochaine séquence de contrôle omettra l'en-tête 0x2B 0xD3, en commençant par l'octet de longueur à la place. Ceci est appelé « enchaînant » et a apparemment été introduit pour conduire les programmeurs en essayant d'analyser ce genre de choses fou.
  5. Passer avant de la longueur 1 octet de longueur et appuyez sur ou il suffit de regarder pour la prochaine 0x2B 0xD3; la dernière séquence de contrôle ne sera pas enchaînée, et tout ce qui suit à la fin de la PTX sera EBCDIC. Utilisez la bibliothèque de Jon Skeet (merci, Jon) et recherchez l'élément suivant PTX.

Désolé, j'étais longue haleine. Il est faisable, mais pas simple.

Attention la lecture des données AFP de cette façon. Il est grand-boutiste dans les deux octets et l'ordre des bits. Vous devrez expliquer que si vous traitez comme des données binaires, telles que l'analyse syntaxique à travers les champs structurés dans un document.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top