2015-07-03 77 views
2

我有一個文件是一些明文的十六進制字節(前18個字節除外),但文件編碼是UTF-16。下面是該文件的一個短轉儲:解碼UTF-16編碼的十六進制字符的字符串

00000000 ff fe 35 1f d3 bb 7a ef df 45 92 df be ff 33 c2 |..5...z..E....3.| 
00000010 af c7 30 00 42 00 45 00 33 00 45 00 35 00 45 00 |..0.B.E.3.E.5.E.| 
00000020 35 00 44 00 35 00 44 00 41 00 36 00 44 00 38 00 |5.D.5.D.A.6.D.8.| 
00000030 42 00 41 00 30 00 37 00 39 00 42 00 46 00 34 00 |B.A.0.7.9.B.F.4.| 
00000040 46 00 31 00 45 00 41 00 36 00 37 00 32 00 34 00 |F.1.E.A.6.7.2.4.| 
00000050 42 00 39 00 43 00 42 00 41 00 42 00 45 00 44 00 |B.9.C.B.A.B.E.D.| 
... 

我想從一個字符串逐行讀取這個文件行(它有\r\n換行符),並獲得十六進制數據。如果這是一個ASCII字符串我可以做到這一點:

a_line = '00112233445566778899' 
hex_data = a_line.decode('hex') 

但因爲它是UTF-16我嘗試這種方法時得到一個Non-hexadecimal digit錯誤。

我的問題是,我該如何加載一串UTF-16編碼的十六進制字符作爲十六進制數據?

回答

1
00000000 ff fe 35 1f d3 bb 7a ef df 45 92 df be ff 33 c2 |..5...z..E....3.| 
00000010 af c7 30 00 42 00 45 00 33 00 45 00 35 00 45 00 |..0.B.E.3.E.5.E.| 

第一行包含非十六進制字符35 1f d3 bb 7a ef ... af c7。所以,要小心解碼 - 它不是純粹的Hex。

可以使用io模塊,在那裏你可以顯式聲明文件編碼讀取該文件:

def main(args): 
    with io.open(testfile, "r", encoding = 'utf-16') as inf: 
     lines = inf.readlines() 

    for line in lines: 
     print(line) 

    return 0 

換行應該會自動檢測到,但你可以在io.open有一個額外的參數明確地定義他們( , newline = "\r\n"

一旦閱讀,您應該能夠正常.decode

相關問題