2009-04-13 287 views
1

我使用一些EBCDIC数据来分析和查找一些十六进制值。我遇到的问题是,看来我正在用不正确的编码读取文件。我可以看到我的记录以“!”(这是EBCDIC中的x5A)开头,但是当转换为十六进制时,它返回为x21,这是“!”的ASCII值。将EBCDIC字符转换为十六进制值(AFP 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

结构化字段数据是我想要得到的。感谢您的意见 – 2009-04-13 21:46:24

4

你可以这样说:

  1. 打开AFP文件。读取前9个字节。
  2. 字节0应该是0xD3或0x5A。字节1和字节2将是SFI的长度,包括您刚刚读取的9个字节中的8个。它是大端,所以长度= byte1 * 256 + byte2。
  3. 字节3,4和5是结构化字段标识符。如果您正在寻找可打印文本,请查找PTX,(Presentation Text Element)0xD3 0xEE 0x9B。如果没有找到,请跳过长度为8的字节并读取下一个9字节。
  4. 如果您确实找到了PTX,请阅读长度为8个字节。通过控制序列来解析文本是有点棘手的。第一个将从0x2b 0xD3开始,长度为一个字节,字节表示它是什么类型的控制序列。如果此字节为奇数,则下一个控制序列将省略0x2B 0xD3标头,而不是从长度字节开始。这被称为“链接”,显然是为了推动程序员试图解析这个疯狂的东西。
  5. 从长度字节length-1跳过并按下或仅查找下一个0x2B 0xD3;最后一个控制序列不会被链接,PTX结束后的所有内容都将是EBCDIC。使用Jon Skeet的库(谢谢Jon)并寻找下一个PTX元素。

对不起,我很啰嗦。这是可行的,但并不简单。

相关问题