2009-04-13 3 views
1

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

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

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

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

3

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

+0

Данные структурированных полей - это то, что я пытаюсь получить. Спасибо за вход –

4

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

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

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