解码UTF-16编码的十六进制字符串

时间:2015-07-03 12:28:12

标签: python hex decode utf-16

我有一个文件是一些明文十六进制字节(前18个字节除外)但文件编码是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 个答案:

答案 0 :(得分:1)

$('#button').click(function () {
    $('#maindiv').transition('fade').css('background-color','red').transition('fade');
});

第一行包含非十六进制字符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.| 。所以,在解码时要小心 - 它不是纯粹的Hex。

您可以使用35 1f d3 bb 7a ef ... af c7模块阅读此文件,您可以在其中明确声明文件编码:

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"