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

标签 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 编码的十六进制字符作为十六进制数据?

最佳答案

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。所以,解码时要小心——它不是纯十六进制。

您可以使用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

关于python - 解码 UTF-16 编码的十六进制字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31206887/

相关文章:

c# - HTML 解码和编码

python - 异步运行时错误 : Event Loop is Closed

linux - 十六进制查找 20 并在 LInux 中替换为 00

c++ - 如何快速解码霍夫曼码?

c - 从二进制文件中读取十六进制

将十六进制数转换为十进制数

c++ - 使用带多线程的 FFMPEG 解码 h264 文件时出错?

python - javascript 中的 OnChange 或 OnBlur 事件在 Django 中运行 python 函数并返回结果?

python - 在 Matplotlib 中自动重新缩放 ylim 和 xlim

python - 具有列表理解的不同模式