def decompress(string): result = [] i = 0 while i < len(string): if string[i].isdigit(): num = int(string[i]) i += 1 count = 0 while string[i].isdigit(): count += 1 num = num * 10 + int(string[i]) i += 1 for j in range(num): result.append(string[i + j]) i += count else: result.append(string[i]) i += 1 return "".join(result)compressed = input() # 输入用数字表示的字符串print(decompress(compressed)) # 输出完整的字符串
时间: 2023-05-21 10:04:50 浏览: 130
这是一个Python函数,名为decompress,作用是将输入的字符串进行解压缩,返回解压后的字符串。具体实现方式如下:
1. 定义一个空列表result,用于存储解压后的字符。
2. 初始化变量i为0,表示字符串的下标从第一个字符开始。
3. 进入while循环,当i小于输入字符串的长度时,继续执行。
4. 如果当前字符是数字,表示需要对后面的字符进行重复,因此记录数字的值,然后移动i的位置。
5. 在循环中,继续移动i的位置,直到遇到第一个非数字的字符,此时数字的个数被统计出来,将其记录为count。
6. 接下来,使用for循环重复num次,将紧跟着数字的count个字符添加到结果列表result中。
7. 最后,将i的位置移动到count处,退出循环。
8. 如果当前字符不是数字,说明是普通字符,将其添加到结果列表result中。
9. 将i的位置加1,继续循环。
10. 循环结束后,将结果列表result中的所有字符转换为字符串,返回即可。
最后,程序需要从标准输入读取一个压缩过的字符串,然后调用decompress函数进行解压缩,并输出解压后的字符串。
相关问题
#!/usr/bin/env python3 import struct, zlib, os, datetime mask, pos = 2 ** 32 - 16, 32 base_path = os.path.abspath("awvs_script_blob_decode_" + datetime.date.today().isoformat()) with open('wvsc_blob.bin', 'rb') as fp: s = fp.read() while pos < len(s): file_len = struct.unpack('<I', s[pos:pos + 4])[0] d = zlib.decompress(s[pos + 4: pos + 4 + file_len]) path_len = ord(struct.unpack('<c', d[1:2])[0]) path = os.path.join(base_path, bytes.decode(d[2 + 1: 2 + path_len])) os.makedirs(os.path.dirname(path), exist_ok=True) open(path, 'wb').write(d[2 + path_len + 1 + 2 + (1 if (len(d) - path_len - 3) > 2 ** 14 else 0) + (1 if (len(d) - path_len - 3) > 2 ** 21 else 0):]) pos += ((file_len + 4) & mask) + 16 代码解析
这段代码是用 Python3 编写的,它的作用是解码 awvs_script_blob_decode_YYYY-MM-DD 目录下的 wvsc_blob.bin 文件,并将其中的文件解压缩并保存到相应的文件路径中。
具体来说,它首先读取 wvsc_blob.bin 文件的内容,并将当前位置 pos 初始化为 32。然后,它进入一个循环,每次从 s[pos:pos+4] 中读取一个 4 字节的文件长度 file_len,再从 s[pos+4:pos+4+file_len] 中读取一个压缩后的二进制字符串 d。接下来,它从 d[1:2] 中读取一个长度 path_len,再从 d[2+1:2+path_len] 中读取文件路径 path,并创建路径中所有不存在的目录。最后,它将 d[2+path_len+1+2:] 中的数据写入到 path 文件中,并将 pos 增加 ((file_len+4)&mask)+16 的值。
其中,mask 的值是 2^32-16,即用来保证每个文件长度都是 16 的倍数;base_path 是 awvs_script_blob_decode_YYYY-MM-DD 目录的绝对路径,可以通过 os.path.abspath() 函数得到;ord(struct.unpack('<c', d[1:2])[0]) 是将 d[1:2] 中的一个字节转换为整数,用来表示文件路径的长度。
修改代码使其能动态调整分辨率 def run(self): self.sock.bind(self.ADDR) self.sock.listen() print('视频服务器已经启动...') print(f'\n工作地址是:{self.ADDR}') conn,addr = self.sock.accept() print(f'\n接受了远程视频客户端{addr}的连接...') data = "".encode("utf-8") payload_size = struct.calcsize("L") cv2.namedWindow('Remote',cv2.WINDOW_AUTOSIZE) while True: cap = cv2.VideoCapture(0) # 动态调整画面分辨率 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) if width > 800: scale_percent = 50 # 缩小画面尺寸 new_width = int(width * scale_percent / 100) new_height = int(height * scale_percent / 100) frame = cv2.resize(frame, (new_width, new_height), interpolation=cv2.INTER_AREA) while len(data)<payload_size: data+=conn.recv(81920) packed_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L",packed_size)[0] while len(data) < msg_size: data += conn.recv(81920) zframe_data = data[:msg_size] data = data[msg_size:] frame_data = zlib.decompress(zframe_data) #解压数据 frame = pickle.loads(frame_data) #还原 cv2.imshow('Remote',frame) if cv2.waitKey(1) & 0xFF ==27: break
您可以将动态调整画面分辨率的代码移动到接收视频帧之前,并将其放在每次循环之前,以便可以实时调整视频分辨率。以下是修改后的示例代码:
```
def run(self):
self.sock.bind(self.ADDR)
self.sock.listen()
print('视频服务器已经启动...')
print(f'\n工作地址是:{self.ADDR}')
conn, addr = self.sock.accept()
print(f'\n接受了远程视频客户端{addr}的连接...')
data = "".encode("utf-8")
payload_size = struct.calcsize("L")
cv2.namedWindow('Remote',cv2.WINDOW_AUTOSIZE)
while True:
# 动态调整画面分辨率
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
if width > 800:
scale_percent = 50 # 缩小画面尺寸
new_width = int(width * scale_percent / 100)
new_height = int(height * scale_percent / 100)
else:
new_width = width
new_height = height
ret, frame = cap.read()
if not ret:
break
frame = cv2.resize(frame, (new_width, new_height), interpolation=cv2.INTER_AREA)
while len(data) < payload_size:
data += conn.recv(81920)
packed_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_size)[0]
while len(data) < msg_size:
data += conn.recv(81920)
zframe_data = data[:msg_size]
data = data[msg_size:]
frame_data = zlib.decompress(zframe_data) #解压数据
frame = pickle.loads(frame_data) #还原
cv2.imshow('Remote',frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
conn.close()
```
在每次循环开始之前,您可以使用OpenCV的VideoCapture对象获取当前视频帧的分辨率,并根据需要进行调整。然后,您可以使用cv2.resize函数将帧调整为新分辨率。最后,您可以通过调整后的帧继续进行后续处理和发送。
阅读全文