2

我试图在一串十六进制数字中找到最大值。我的转换方法是对字符串进行标记,将该标记列表转换为整数,然后取最大值。

字符串的格式如下:

'\x1e\x00\x00\x00\xf0\x0f184203308373388492761797873987'

我无法控制格式,因为它是 LZ4 算法的 Python 绑定的输出。

SO上的其他类似答案没有混合类型或在具有许多十六进制数字的字符串中使用转义字符。

那么,我如何将其变成一个列表,例如:

[0x1e, 0x00, 0x00, ...]

感谢您的帮助。

4

1 回答 1

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]

并比较......甚至更好,正如帝斯曼所说

>>> s = '\x1e\x00\x00\x00\xf0\x0f184203308373388492761797873987'
>>> ord(max(s))
240
于 2012-06-07T16:36:39.243 回答