2009-04-13 286 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元素。

對不起,我很囉嗦。這是可行的,但並不簡單。

相關問題