我使用一些需要解析并找到一些十六进制值的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的长度,包括您刚刚阅读的9个字节中的8个。它是大的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。使用Jon Skeet的库(谢谢Jon),并查找下一个PTX元素。

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

以这种方式仔细阅读AFP数据。它在字节和位秩序上都是大型的。如果将其视为二进制数据,例如通过文档中的结构化字段解析,则需要考虑这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top