Python Socket畸形字节解码问题:如何提取目标数字命令?
解决Socket服务端提取ASCII命令数字的问题
你遇到的情况是客户端发送的ASCII命令数字在传输后混入了特定错误字节序列\xa3\xb6(对应数字6的错误编码),而数字7能正常传输。针对这个场景,可以通过替换错误字节序列+提取数字的方式来获取正确命令。
解决方案1:针对已知错误字节序列替换
如果确认\xa3\xb6始终对应数字6,直接替换该字节序列为ASCII的6(b'6'),再提取所有数字字符:
import socket import logging logger = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) def get_command(data): # 替换错误字节序列b'\xa3\xb6'为对应数字6的ASCII字节 corrected_data = data.replace(b'\xa3\xb6', b'6') # 过滤出所有ASCII数字字节(0-9对应48-57) digit_bytes = [b for b in corrected_data if 48 <= b <= 57] # 拼接成字节串并解码为字符串 command = b''.join(digit_bytes).decode('ascii') # 如果没有提取到数字,返回空字符串或自定义默认值 return command if command else "" server_ip = '0.0.0.0' server_port = 1234 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((server_ip, server_port)) server_socket.listen(5) logger.info(f"Server listening on {server_ip}:{server_port}") while True: client_socket, client_addr = server_socket.accept() logger.info(f"Connected with {client_addr}") while True: data = client_socket.recv(1024) if not data: logger.info(f"Client {client_addr} disconnected") client_socket.close() break command = get_command(data) logger.info(f"Received command: {command}")
解决方案2:通用数字提取(适用于未知错误字节)
如果不确定错误字节的规律,直接过滤出所有ASCII数字字节,忽略其他无关字节:
def get_command(data): # 仅保留ASCII数字对应的字节 digit_bytes = [b for b in data if 48 <= b <= 57] command = b''.join(digit_bytes).decode('ascii') return command if command else ""
补充说明
- 方案1针对你给出的示例场景精准处理,能还原出客户端发送的66、67;
- 方案2更通用,不管混入什么非数字字节,都能提取出所有数字命令;
- 原代码中缺少
client_socket, client_addr = server_socket.accept()的连接接收逻辑,已在修改后的代码中补充,避免运行报错。
内容的提问来源于stack exchange,提问作者GruntChopper
相关产品推荐
相关产品推荐

