La conversione EBCDIC Char a Hex valori (AFP EBCDIC dati)
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!
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:
- Aprire il file AFP. Leggere i primi 9 byte.
- 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.
- 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.
- 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.
- 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.