如何检查字节数组中是否存在字符

时间:2015-08-30 17:06:57

标签: python arrays

这对我来说听起来太基本了但是这里有。我有一个bytearray。我想检查数组中是否存在'a'或'A',并打印出它们的数量。我做了以下但我没有看到任何,即使我知道那里有'a' -

a_bytes = bytearray.fromhex(hex_string)
count = 0
for x in a_bytes:
    if ( (x=='a') or (x == 'A') ):
        count = count+1

return count

为什么上面的代码不起作用?我将字节值打印为整数,我看到65次重复多次。 然后我再次尝试使用int('a')将常量'a'转换为整数但是我得到一个错误 -

ValueError: invalid literal for int() with base 10: 'a'

4 个答案:

答案 0 :(得分:0)

bytearray中的值存储为整数,而不是十六进制表示。您需要搜索6597,而不是"A""a"

如果要使用它来查找字符串,只需使用列表即可。如果您对字节的整数值不感兴趣,则bytearray不是正确的选择。此外,如果您使用列表,则可以使用列表的.count方法直接计算特定值的出现次数。

答案 1 :(得分:0)

使用函数ordchr完成字符及其整数值之间的转换。所以ord('A') == 65

由于字节数组将值存储为整数,因此结果为

 a_bytes = bytearray.fromhex(hex_string)
 count = sum(c == ord('A') or c == ord('b') for c in a_bytes)

这是有效的,因为True1False0

答案 2 :(得分:0)

如果您想使用字符串和字符,则需要首先解码字节数据:

a_bytes = bytearray.fromhex(hex_string).decode('ascii')
count = 0
for x in a_bytes:
    if x == 'a' or x == 'A':
        count += 1

return count

答案 3 :(得分:0)

intstr类型之间不支持比较。您正在尝试将字节与字符串或字符进行比较。要获取角色的unicode代码点,您可以使用ord()函数。请注意,unicode代码点是介于0和大约1百万之间的整数(与[0-255]的字节范围不同)但是在字节数组中使用某些编码的情况下(假设ascii或utf-8)和在ascii字符的情况下,ord()的使用是可以的。引入字节数组和字符串(编码)之间的关系超出了这个答案的范围。

更正代码的解决方案是将'a''A'分别替换为ord('a')ord('A')

然而,不是你的解决方案,我会这样做:

count = a_bytes.count(b'a') + a_bytes.count(b'A')

这使得代码在您的方案中更加简单易读。