将EBCDIC CHAR转换为HEX值(AFP EBCDIC数据)
题
我使用一些需要解析并找到一些十六进制值的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实施 - 但是我认为您真的只需要下定决心将其视为二进制数据还是文本。
其他提示
您可以这样做:
- 打开AFP文件。阅读前9个字节。
- 字节0应为0xD3或0x5a。字节1和字节2将是SFI的长度,包括您刚刚阅读的9个字节中的8个。它是大的endian,因此长度= byte1 * 256+byte2。
- 字节3、4和5是结构化场标识符。如果您正在寻找可打印的文本,请查找PTX,(演示文本元素)0xD3 0xee 0x9b。跳过长度为8,如果找不到它,请阅读接下来的9个字节。
- 如果您确实找到了PTX,请读取长度8字节。通过控制序列解析以获取文本有点棘手。第一个将以0x2b 0xd3的形式开始,该长度的字节和字节是什么样的控制序列。如果此字节是一个奇数,则下一个控件序列将省略0x2b 0xd3标头,从长度字节开始。这称为“链接”,显然是为了驱动程序员试图解析这些东西疯狂的方法。
- 从长度字节长1跳前,然后按下或只是查找下一个0x2b 0xd3;最后一个控制序列不会被束缚,而在PTX末尾的所有内容都将是EBCDIC。使用Jon Skeet的库(谢谢Jon),并查找下一个PTX元素。
对不起,我很长。这是可行的,但并不简单。
以这种方式仔细阅读AFP数据。它在字节和位秩序上都是大型的。如果将其视为二进制数据,例如通过文档中的结构化字段解析,则需要考虑这一点。
不隶属于 StackOverflow