解码 UTF-16 编码的十六进制字符的字符串
Decoding strings of UTF-16 encoded hex characters
我有一个文件是一些明文十六进制字节(前 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
正常。
我有一个文件是一些明文十六进制字节(前 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
正常。