在Python中将十六进制字符串转换为实际字节

6 投票
5 回答
17883 浏览
提问于 2025-04-16 03:00

我需要把这个文本文件的第三列加载为十六进制字符串。

http://www.netmite.com/android/mydroid/1.6/external/skia/emoji/gmojiraw.txt

>>> open('gmojiraw.txt').read().split('\n')[0].split('\t')[2]
'\\xF3\\xBE\\x80\\x80'

我该怎么打开这个文件,才能把第三列提取为十六进制字符串呢?

'\xF3\xBE\x80\x80'

我也尝试过用二进制模式和十六进制模式,但都没有成功。

5 个回答

5

如果你在使用Python2.6或更高版本,这里有一种安全使用eval的方法。

>>> from ast import literal_eval
>>> item='\\xF3\\xBE\\x80\\x80'
>>> literal_eval("'%s'"%item)
'\xf3\xbe\x80\x80'
7

快速简单的回复

your_string.decode('string_escape')

>>> a='\\xF3\\xBE\\x80\\x80'
>>> a.decode('string_escape')
'\xf3\xbe\x80\x80'
>>> len(_)
4

额外信息

>>> u='\uDBB8\uDC03'
>>> u.decode('unicode_escape')

一些小知识

有趣的是,我在Karmic Koala Ubuntu上使用的是Python 2.6.4(sys.maxunicode==1114111),而在Gentoo上使用的是Python 2.6.5(sys.maxunicode==65535);在Ubuntu上,unicode_escape解码的结果是\uDBB8\uDC03,而在Gentoo上是u'\U000fe003',这两个结果的长度都是2。除非在2.6.4和2.6.5之间有什么修复,否则我对Gentoo的这个2字节每个unicode字符的版本能正确报告字符感到很惊讶。

7

你可以这样做:

  1. 去掉 \x 后面的字母
  2. 对得到的字符串使用 .decode('hex')

代码:

>>> '\\xF3\\xBE\\x80\\x80'.replace('\\x', '').decode('hex')
'\xf3\xbe\x80\x80'

注意反斜杠的正确理解。当字符串表示为 '\xf3' 时,它表示这是一个单字节字符串,字节值是 0xF3。而当它是 '\\xf3' 时,也就是你的输入,这意味着这是一个由 4 个字符组成的字符串:\xf3

撰写回答