Convertendo o char ebcdic em valores hexadecimais (dados AFP EBCDIC)
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!
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:
- Abra o arquivo AFP. Leia os 9 primeiros bytes.
- 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.
- 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.
- 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.
- 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.