1

我使用一些需要解析并找到一些十六进制值的 EBCDIC 数据。我遇到的问题是,我似乎正在使用不正确的编码读取文件。我可以看到我的记录以“ ”开头(在 EBCDIC!中是 a ),但是在转换为十六进制时,它返回为 a ,这是“ ”的 ASCII 值。x5Ax21!

我希望框架中有一个内置方法,但恐怕我将不得不创建一个自定义类来正确映射 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

谢谢!

4

3 回答 3

4

你可以这样做:

  1. 打开法新社文件。读取前 9 个字节。
  2. 字节 0 应为 0xD3 或 0x5A。字节 1 和字节 2 将是 SFI 的长度,包括您刚刚读取的 9 个字节中的 8 个。它是大端,所以长度 = byte1 * 256+byte2。
  3. 字节 3、4 和 5 是结构化字段标识符。如果您正在寻找可打印的文本,请寻找 PTX,(演示文本元素)0xD3 0xEE 0x9B。如果没有找到,请向前跳过 length-8 并读取接下来的 9 个字节。
  4. 如果您确实找到了 PTX,请读取长度为 8 字节的内容。解析控制序列以获取文本有点棘手。第一个将从 0x2b 0xD3 开始,一个字节表示长度,字节表示它是哪种控制序列。如果此字节为奇数,则下一个控制序列将省略 0x2B 0xD3 标头,而是从长度字节开始。这被称为“链接”,显然是为了驱使程序员疯狂地解析这些东西而引入的。
  5. 从长度字节length-1 向前跳过并按下或只是寻找下一个0x2B 0xD3;最后一个控制序列将不会被链接,并且 PTX 末尾之后的所有内容都将是 EBCDIC。使用 Jon Skeet 的库(感谢 Jon)并寻找下一个 PTX 元素。

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

于 2009-04-14T14:30:47.150 回答
3

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

如果您真的需要使用自定义 EBCDIC 编码来做任何事情,您可以使用我的开源 EBCDIC 实现——但我认为您真的只需要下定决心将其视为二进制数据还是文本。

于 2009-04-13T16:59:24.883 回答
3

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

于 2009-04-13T20:21:48.093 回答