将EBCDIC字符转换为十六进制值(AFP EBCDIC数据)

时间:2009-04-13 16:35:15

标签: .net vb.net hex ebcdic

我使用了一些需要解析的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 个答案:

答案 0 :(得分:4)

你可以这样做:

  1. 打开AFP文件。读取前9个字节。
  2. 字节0应为0xD3或0x5A。字节1和字节2将是SFI的长度,包括刚刚读取的9个字节中的8个。它是大端,所以长度= 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。使用Jon Skeet的库(谢谢,Jon)并寻找下一个PTX元素。
  6. 抱歉,我很啰嗦。这是可行的,但并不简单。

答案 1 :(得分:3)

是的,当您以字符串形式读取文本数据时,它将内部存储为Unicode。如果你关心二进制值(即原始字节),那么首先不要解码它。

如果您真的需要使用自定义EBCDIC编码做任何事情,可以使用我的open source EBCDIC implementation - 但我认为您真的只需要决定是将其视为二进制数据还是文本。

答案 2 :(得分:3)

小心读取AFP数据。它是字节和位顺序的大端。如果您将其视为二进制数据,则需要考虑到这一点,例如通过文档中的结构化字段进行解析。