检查字符串是否为十六进制

我知道最简单的方法是使用正则表达式,但是我想知道是否还有其他方法可以执行此检查。

我为什么需要这个?我正在编写一个Python脚本,该脚本从SIM卡读取文本消息(SMS)。在某些情况下,十六进制消息会到达,我需要对其进行一些处理,因此我需要检查接收到的消息是否为十六进制。

当我发送以下短信时:

Hello world!

我的脚本收到

00480065006C006C006F00200077006F0072006C00640021

但是在某些情况下,我会收到普通的短信(不是十六进制)。所以我需要做一个 控制。

我正在使用Python 2.6.5。

更新:

该问题的原因是,(以某种方式)我发送的消息是在接收hex操作员发送的消息(信息消息和广告)时作为普通字符串接收的。因此,我决定进行检查并确保以正确的字符串格式显示消息。

:我正在使用华为3G调制解调器和PyHumod从SIM卡读取数据。

处理此类字符串的最佳方法是使用a2b_hex(aka unhexlify)和utf-16 big endian

encoding(如@JonasWielicki所述):

from binascii import unhexlify  # unhexlify is another name of a2b_hex

mystr = "00480065006C006C006F00200077006F0072006C00640021"

unhexlify(mystr).encode("utf-16-be")

>> u'Hello world!'

回答:

使用int()可以很好地解决此问题,Python会为您完成所有检查:)

int('00480065006C006C006F00200077006F0072006C00640021', 16)

6896377547970387516320582441726837832153446723333914657L

将工作。万一失败,您将收到一个ValueError例外。

简短示例:

int('af', 16)

175

int('ah', 16)

...

ValueError: invalid literal for int() with base 16: 'ah'

一种 替代

将遍历数据,并确保所有字符落入的范围内0..9a-f/A-Fstring.hexdigits'0123456789abcdefABCDEF'因为它包含)是这个有用的

两个 上和下壳体数字。

import string

all(c in string.hexdigits for c in s)

会根据string中数据的有效性返回True或。False``s

简短示例:

s = 'af'

all(c in string.hexdigits for c in s)

True

s = 'ah'

all(c in string.hexdigits for c in s)

False

注意事项

正如@ScottGriffiths在下面的注释中正确指出的那样,int()如果您的字符串0x开头包含该方法,则该方法将起作用,而逐字符检查将因此失败。同样,检查一

字符比 一串

字符要快,但是值得怀疑的是,这对于短的SMS字符串会很重要,除非您依次处理许多(很多!)字符,在这种情况下,您可以将stringhexditigs转换为一组字符与set(string.hexdigits)

以上是 检查字符串是否为十六进制 的全部内容, 来源链接: utcz.com/qa/421303.html

回到顶部