Преобразование символов EBCDIC в шестнадцатеричные значения (данные AFP EBCDIC)

StackOverflow https://stackoverflow.com/questions/744486

  •  09-09-2019
  •  | 
  •  

Вопрос

Я работаю с некоторыми данными EBCDIC, которые мне нужно проанализировать и найти шестнадцатеричные значения.У меня проблема в том, что кажется, что я читаю файл с неправильной кодировкой.Я вижу, что моя запись начинается с "!"(что представляет собой x5A в EBCDIC), но при преобразовании в шестнадцатеричный формат возвращается x21, которое представляет собой значение ASCII для "!".

Я надеялся, что в платформе есть встроенный метод, но боюсь, что мне придется создать собственный класс для правильного сопоставления набора символов 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

Спасибо!

Это было полезно?

Решение

Да, когда вы читаете текстовые данные в виде строк, они сохраняются внутри как Unicode.Если вы заботитесь о двоичный ценности (т.необработанные байты), то вообще не декодируйте его.

Если вам действительно нужно что-то сделать с собственной кодировкой EBCDIC, вы можете использовать мою реализация EBCDIC с открытым исходным кодом - но я думаю, вам просто нужно решить, рассматриваете ли вы это как двоичные данные или текст.

Другие советы

Вы можете сделать это следующим образом:

  1. Откройте файл AFP.Прочитайте первые 9 байт.
  2. Байт 0 должен быть 0xD3 или 0x5A.Байт 1 и байт 2 будут длиной SFI, включая 8 из 9 байтов, которые вы только что прочитали.Это обратный порядок байтов, поэтому длина = байт1 * 256+байт2.
  3. Байты 3, 4 и 5 — это идентификатор структурированного поля.Если вам нужен текст для печати, найдите PTX (текстовый элемент презентации) 0xD3 0xEE 0x9B.Пропустите длину-8 и прочитайте следующие 9 байт, если вы ее не нашли.
  4. Если вы нашли PTX, прочитайте длину — 8 байт.Разобрать управляющие последовательности, чтобы добраться до текста, немного сложно.Первый будет начинаться с 0x2b 0xD3, байта длины и байта типа управляющей последовательности.Если этот байт является нечетным числом, следующая управляющая последовательность будет опускать заголовок 0x2B 0xD3, начиная с байта длины.Это называется «цепочкой» и, по-видимому, было введено для того, чтобы программисты пытались свести с ума этот материал.
  5. Пропустите длину байта length-1 и нажмите или просто найдите следующий 0x2B 0xD3;последняя управляющая последовательность не будет сцеплена, и все, что следует до конца PTX, будет EBCDIC.Используйте библиотеку Джона Скита (спасибо, Джон) и найдите следующий элемент PTX.

Извините, я был многословен.Это осуществимо, но не просто.

Будьте осторожны, читая таким образом данные AFP.Это обратный порядок байтов и битов.Вам нужно будет это учитывать, если вы рассматриваете их как двоичные данные, например, при анализе структурированных полей в документе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top