gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:38:31 31 4
gpt4 key购买 nike

我知道最简单的方法是使用 regular expression ,但我想知道是否有其他方法可以进行此检查。

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

当我发送以下短信时:

Hello world!

我的脚本收到

00480065006C006C006F00200077006F0072006C00640021

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

我使用的是 Python 2.6.5。

更新:

这个问题的原因是,(不知何故)我发送的消息被接收为 hex 而运算符(operator)发送的消息(信息消息和广告。)被接收为普通字符串。所以我决定检查一下,确保我收到的消息是正确的字符串格式。

一些额外的细节:我使用的是华为 3G 调制解调器和 PyHumod从 SIM 卡中读取数据。

我的情况可能的最佳解决方案:

处理此类字符串的最佳方法是使用 a2b_hex(又名 unhexlify)和 utf-16 大端编码(如 @JonasWielicki 所述):

from binascii import unhexlify  # unhexlify is another name of a2b_hex

mystr = "00480065006C006C006F00200077006F0072006C00640021"
unhexlify(mystr).encode("utf-16-be")
>> u'Hello world!'

最佳答案

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

int('00480065006C006C006F00200077006F0072006C00640021', 16)
6896377547970387516320582441726837832153446723333914657L

会起作用。如果失败,您将收到 ValueError 异常。

简短的例子:

int('af', 16)
175

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

(2)替代方法是遍历数据并确保所有字符都在 0..9 的范围内,并且a-f/A-Fstring.hexdigits ('0123456789abcdefABCDEF') 对此很有用,因为它包含 大写和小写数字。

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

将根据字符串 s 中数据的有效性返回 TrueFalse

简短的例子:

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 在下面的评论中正确指出的那样,如果您的字符串在开头包含 0x ,则 int() 方法将起作用,而逐个字符检查将因此失败。此外,检查 set 个字符比检查一个 string 个字符要快,但是这对于短 SMS 字符串是否有影响值得怀疑,除非您处理很多(很多!)它们按顺序排列,在这种情况下,您可以使用 set(string.hexdigits) 将 stringhexditigs 转换为集合。

关于python - 检查字符串是否为十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592261/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com