我正在编写一个简单的程序来解码以下给出的二进制字符串:
bin_str = "101100001101100001"
首先,如果第一个字符由“ 1”表示,则接下来的八个字符将被解码为“ 01100001”,在此我将“ 01100001”传递给函数以获取其ascii表示形式。
def convert_ascii(binary):
c = chr(int(binary, 2))
return c
将“ 01100001”传递给上述函数将产生“ a”,这是解码的第一个字符。继续,索引9处的下一个字符也由“ 1”表示,因此接下来的八个字符也将被解码为“ 01100001”。传递到上面也会产生“ a”。
lst = []
fixed_length = 8
i = 0
while i < len(bin_str):
if binary[i] == "1":
fl_bin = binary[i+1:fixed_length+1] #issue here
ascii_rep = convert_ascii(fl_bin)
lst.append(ascii_rep)
i+=fixed_length+1
我面临的问题是从原始bin_str中切出长度为8的特定字符串“ 01100001”,在此我尝试以[i + 1:fixed_length + 1]进行切片,但是在第二阶段,fl_bin变成了“”而不是下一个“ 01100001”。
希望对此有所帮助。
答案 0 :(得分:1)
执行此操作的一种好方法是创建一个正则表达式,该表达式与1
匹配,后跟正好八个1
或0
个字符,然后使用re.findall()
查找所有正则表达式。字符串中此模式的非重叠出现。通过使用非捕获组,您甚至可以防止将初始1
数字包括在结果中(尽管如果您不这样做,则将其切掉很简单)。
import re
reg_ex = "(?:1)([01]{8})"
bin_str = "101100001101100001"
ascii_rep = "".join(chr(int(byte, 2)) for byte in re.findall(reg_ex, bin_str))
作为奖励,这允许源字符串中的组被分隔(由空格,单词或任何非1
后跟8个0
或1
的分隔s),以便阅读。
答案 1 :(得分:0)
如果iter
产生next
,则使用next
和1
进行循环,然后创建接下来8个项目的子列表,将其追加到主列表中并重复直到发电机耗尽。
bin_str = "101100001101100001"
a = iter(bin_str)
lst = []
while True:
try:
b = next(a)
z = []
if b == '1':
for i in range(8):
z.append(next(a))
lst.append(''.join(z))
except StopIteration:
break
print(lst)
# ['01100001', '01100001']