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!

¿Fue útil?

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:

  1. Abra el archivo de la AFP. Leer los 9 primeros bytes.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top