这对我来说听起来太基本了但是这里有。我有一个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'
答案 0 :(得分:0)
bytearray中的值存储为整数,而不是十六进制表示。您需要搜索65
或97
,而不是"A"
或"a"
。
如果要使用它来查找字符串,只需使用列表即可。如果您对字节的整数值不感兴趣,则bytearray不是正确的选择。此外,如果您使用列表,则可以使用列表的.count
方法直接计算特定值的出现次数。
答案 1 :(得分:0)
使用函数ord
和chr
完成字符及其整数值之间的转换。所以ord('A') == 65
。
由于字节数组将值存储为整数,因此结果为
a_bytes = bytearray.fromhex(hex_string)
count = sum(c == ord('A') or c == ord('b') for c in a_bytes)
这是有效的,因为True
为1
且False
为0
答案 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)
int
和str
类型之间不支持比较。您正在尝试将字节与字符串或字符进行比较。要获取角色的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')
这使得代码在您的方案中更加简单易读。