Преобразование EBCDIC Char в значения Hex (данные AFP EBCDIC) - PullRequest
1 голос
/ 13 апреля 2009

Я работаю с некоторыми данными EBCDIC, которые мне нужно проанализировать и найти некоторые значения Hex. У меня проблема в том, что кажется, что я читаю файл с неправильной кодировкой. Я вижу, что моя запись начинается с "!" (что в EBCDIC x5A), но при выполнении преобразования в шестнадцатеричное значение возвращается как 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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 14 апреля 2009

Вы можете сделать это так:

  1. Откройте файл AFP. Прочитайте первые 9 байтов.
  2. Байт 0 должен быть 0xD3 или 0x5A. Байт 1 и 2 будут длиной SFI, включая 8 из 9 байтов, которые вы только что прочитали. Это прямой порядок байтов, поэтому длина = byte1 * 256 + byte2.
  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.

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

3 голосов
/ 14 апреля 2009

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

3 голосов
/ 13 апреля 2009

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

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

...