我正在尝试在十六进制数字字符串中找到最大值。我的方法是转换是为了对字符串进行标记化,将该标记列表转换为整数,然后取最大值。
字符串的格式如下:
'\x1e\x00\x00\x00\xf0\x0f184203308373388492761797873987'
我无法控制格式,因为它是LZ4算法的Python绑定的输出。
SO上的其他类似答案没有混合类型或在具有许多十六进制数的字符串中使用转义字符。
那么,我该如何将其转换为如下列表:
[0x1e, 0x00, 0x00, ...]
感谢您的帮助。
答案 0 :(得分:1)
我不确定你怎么想在十六进制值之后得到整数...它们应该是1,2,还是 x 数字?
所以,我这样做:
import re
# convert unicode or string to raw
def raw(s):
if isinstance(s, str):
s = s.encode('string-escape')
elif isinstance(s, unicode):
s = s.encode('unicode-escape')
return s
s = '\x1e\x00\x00\x00\xf0\x0f184203308373388492761797873987'
print [ re.sub(r'\\', r'0', raw(i)) for i in s]
我明白了:
['0x1e', '0x00', '0x00', '0x00', '0xf0', '0x0f', '1', '8', '4', '2', '0', '3', '3', '0', '8', '3', '7', '3', '3', '8', '8', '4', '9', '2', '7', '6', '1', '7', '9', '7', '8', '7', '3', '9', '8', '7']
希望可以提供帮助
编辑简化了列表理解
编辑:如果您确实要删除非十六进制值,那么可以使用
>>> print [int(re.sub(r'\\', r'0', raw(i)), 16) for i in s if len(raw(i))>1]
[30, 0, 0, 0, 240, 15]
并且比较......或者甚至更好,如DSM所述
>>> s = '\x1e\x00\x00\x00\xf0\x0f184203308373388492761797873987'
>>> ord(max(s))
240