Domanda

I lavorare con alcuni dati EBCDIC che ho bisogno di analizzare e trovare alcuni valori esadecimali. Il problema che sto avendo è che sembra che sto leggendo il file con la codifica corretta. Vedo che il mio record inizia con "!" (che è un x5A in EBCDIC), ma quando si fa la conversione in esadecimale restituisce come un x21, che è il valore ASCII per un "!".

Speravo che ci fosse un metodo incorporato nel quadro, ma ho paura che sto andando a creare una classe personalizzata per mappare correttamente il set di caratteri 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

Grazie!

È stato utile?

Soluzione

Sì, quando si leggono i dati di testo in come stringhe, è la memorizzazione internamente come Unicode. Se vi preoccupate per il binario valori (vale a dire il byte crudo) allora non decodificarlo, in primo luogo.

Se avete veramente bisogno di fare qualsiasi cosa con una codifica EBCDIC personalizzato, è possibile utilizzare la mia open source EBCDIC implementazione - ma penso che davvero solo bisogno di fare la vostra mente sul fatto che si sta trattando questo come dati binari o testo

.

Altri suggerimenti

Si può fare in questo modo:

  1. Aprire il file AFP. Leggere i primi 9 byte.
  2. Byte 0 dovrebbe essere 0xD3 o 0x5A. Byte 1 e byte 2 sarà la lunghezza della SFI, tra cui 8 delle 9 byte che hai appena letto. È big endian, quindi la lunghezza = byte1 * 256 + byte2.
  3. Byte 3, 4, e 5 è il Structured campo Identifier. Se siete alla ricerca di testo stampabile, cercare PTX, (Presentazione Testo Element) 0xD3 0xEE 0x9B. Vai avanti di lunghezza-8 e leggere i prossimi 9 byte se non avete trovato esso.
  4. Se avete trovato un PTX, lettura della lunghezza di 8 byte. Analisi attraverso le sequenze di controllo per raggiungere il testo è un po 'difficile. Il primo inizierà con 0x2b 0xD3, un byte per la lunghezza e per byte che tipo di sequenza di controllo che è. Se questo byte è un numero dispari, la successiva sequenza di controllo sarà omettere l'intestazione 0x2B 0xD3, iniziando con il byte di lunghezza invece. Questo si chiama "chaining" ed è stato evidentemente introdotto per guidare i programmatori cercando di analizzare questa roba folle.
  5. Vai avanti dal byte di lunghezza lunghezza 1 e premere su o semplicemente cercare il prossimo 0x2B 0xD3; l'ultima sequenza di controllo non verrà incatenato, e tutto seguendo alla fine del PTX sarà EBCDIC. Utilizzare biblioteca di Jon Skeet (grazie, Jon) e cercare il successivo elemento PTX.

Siamo spiacenti ero prolisso. E 'fattibile, ma non semplice.

Fare attenzione la lettura dei dati AFP in quel modo. E 'big-endian sia di byte e bit di ordine. Sarà necessario tenere conto di che, se si sta trattando come dati binari, come ad esempio l'analisi attraverso i campi strutturati in un documento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top