检查字符串是否为十六进制
我知道最简单的方法是使用正则表达式,但是我想知道是否还有其他方法可以执行此检查。
我为什么需要这个?我正在编写一个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_hexmystr = "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..9
和a-f/A-F
。string.hexdigits
('0123456789abcdefABCDEF'
因为它包含)是这个有用的
两个 上和下壳体数字。
import stringall(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