Pergunta

Trabalho com alguns dados EBCDIC que preciso analisar e encontrar alguns valores hexadecimais. O problema que estou tendo é que parece que estou lendo o arquivo com a codificação incorreta. Eu posso ver que meu registro começa com "!" (que é um x5A em ebcdic), mas ao fazer a conversão em hexadecimal, ele retorna como um x21, que é o valor ASCII para um "!".

Eu esperava que houvesse um método embutido na estrutura, mas tenho medo de ter que criar uma classe personalizada para mapear corretamente o conjunto 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

Obrigado!

Foi útil?

Solução

Sim, quando você lê os dados de texto como strings, ele o armazena internamente como Unicode. Se você se importa com o binário Valores (ou seja, os bytes crus), então não o decodifiquem em primeiro lugar.

Se você realmente precisa fazer qualquer coisa com uma codificação EBCDIC personalizada, você pode usar meu Implementação EBCDIC de código aberto - Mas acho que você realmente só precisa se decidir se está tratando isso como dados ou texto binários.

Outras dicas

Você pode fazer assim:

  1. Abra o arquivo AFP. Leia os 9 primeiros bytes.
  2. Byte 0 deve ser 0xd3 ou 0x5a. Byte 1 e Byte 2 serão o comprimento do SFI, incluindo 8 dos 9 bytes que você acabou de ler. É grande endian, então o comprimento = byte1 * 256+byte2.
  3. Bytes 3, 4 e 5 é o identificador de campo estruturado. Se você estiver procurando por texto imprimível, procure PTX, (elemento de texto de apresentação) 0xd3 0Xee 0x9b. Pule o comprimento 8 e leia os próximos 9 bytes se você não o encontrar.
  4. Se você encontrou um PTX, leia o comprimento 8 bytes. Analisar as seqüências de controle para chegar ao texto é um pouco complicado. O primeiro começará com 0x2b 0xd3, um byte para o comprimento e byte para que tipo de sequência de controle é. Se este byte for um número ímpar, a próxima sequência de controle omitirá o cabeçalho 0x2b 0xd3, começando com o byte de comprimento. Isso é chamado de "encadeamento" e aparentemente foi apresentado para impulsionar os programadores tentando analisar esse material insano.
  5. Pule a frente do comprimento do comprimento do comprimento-1 e pressione ou basta procurar o próximo 0x2b 0xd3; A última sequência de controle não será encadeada, e tudo o que segue até o final do PTX será eBCDIC. Use a biblioteca de Jon Skeet (obrigado, Jon) e procure o próximo elemento PTX.

Desculpe, eu estava muito tempo. É factível, mas não simples.

Tenha cuidado para ler dados AFP dessa maneira. É grande endiano em ordem de byte e bit. Você precisará explicar isso se estiver tratando -o como dados binários, como analisar os campos estruturados em um documento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top