La conversión de EBCDIC Char a Hex valores (AFP EBCDIC de datos)
Pregunta
trabajar con algunos datos EBCDIC que necesito para analizar y encontrar algunos valores Hex. El problema que estoy teniendo es que parece que estoy leyendo el archivo con la codificación incorrecta. Puedo ver que mi disco comienza con "!
" (que es un x5A
en EBCDIC), pero cuando se hace la conversión a hexadecimal que devuelve como un x21
, que es el valor ASCII de un "!
".
Tenía la esperanza de que había un método integrado en el marco, pero me temo que voy a tener que crear una clase personalizada para asignar correctamente el juego de caracteres 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
Gracias!
Solución
Sí, cuando uno lee los datos de texto en forma de cadenas, se almacena internamente como Unicode. Si usted se preocupa por el binario los valores (es decir, la prima bytes) entonces no decodificarlo en el primer lugar.
Si realmente necesita hacer nada con una codificación EBCDIC personalizada, puede usar mi EBCDIC aplicación - pero creo que realmente sólo tiene que tomar una decisión en cuanto a si se está tratando esto como datos binarios o de texto
.Otros consejos
Puede hacerlo de esta manera:
- Abra el archivo de la AFP. Leer los 9 primeros bytes.
- Byte 0 debe ser 0xD3 o 0x5A. El byte 1 byte y 2 serán la longitud de la SFI, incluyendo 8 de los 9 bytes que acaba de leer. Es big endian, por lo que la longitud = byte1 * 256 + Byte2.
- Bytes 3, 4, y 5 es el identificador de campo estructurado. Si usted está buscando para imprimir texto, busque PTX, (Presentación elemento de texto) 0xD3 0xEE 0x9B. Pase a la longitud-8 y lea los próximos 9 bytes si no lo encuentra.
- Si se encontró un PTX, leer longitud de 8 bytes. El análisis a través de las secuencias de control para llegar al texto es un poco difícil. El primero será comenzar con 0x2B 0xD3, un byte para la longitud, y el byte de qué tipo de secuencia de control que es. Si este byte es un número impar, la siguiente secuencia de control se omite la cabecera 0x2B 0xD3, empezando por el byte de longitud en su lugar. Esto se denomina "encadenamiento" y al parecer se introdujo para conducir los programadores intentar analizar estas cosas loco.
- Avance de la longitud de bytes de longitud-1 y presionar sobre o simplemente buscar la siguiente 0x2B 0xD3; la última secuencia de control no será encadenado, y todo lo siguiente al final de la PTX será EBCDIC. Utilizar la biblioteca de Jon Skeet (gracias, Jon) y buscar el siguiente elemento PTX.
En este momento yo era de largo aliento. Es factible, pero no es sencillo.
Tenga cuidado de leer los datos de AFP de esa manera. Es bigEndian tanto en bytes y orden de los bits. Tendrá que tener en cuenta que si usted está tratando como datos binarios, tales como el análisis a través de los campos estructurados en un documento.