ISO-8859-1编码转换异常求助:以太网传输数据解码问题
解决ISO-8859-1 Unicode转换异常的方案
你遇到的问题本质是把二进制数值数据当成文本数据处理的逻辑错位——毕竟你传输的是无符号整数的原始二进制流,不是文本内容,硬套ISO-8859-1这种文本编码的处理方式,很容易踩转换异常的坑。我给你拆解下问题根源和具体解决办法:
问题核心
ISO-8859-1是单字节文本编码,它能把每个字节映射成一个字符(不会丢失数据),但如果你试图直接把解码后的字符串转换成数值,就会因为字符串不是合法的数字格式而抛出异常。而且这种多此一举的编码/解码步骤,对处理二进制数值数据来说完全没必要。
正确的传输与接收流程
1. 发送端:直接打包二进制数据
用Python的struct模块把你的unsigned int数组转换成标准的二进制字节流,同时指定字节序(推荐用网络字节序,也就是大端序,跨平台兼容性更好)。
示例代码:
import socket import struct # 整理你的二维数组(这里假设ROW=3,COLUMN=4,匹配你的初始化逻辑) test_value = [ [0x00000001, 0x40000001], # 对应你注释里的索引0行 [0x80018120], # 索引1行 [0x825283ff] # 索引2行 ] # 创建socket并发送数据 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("目标IP地址", 目标端口)) # 遍历数组,逐个打包发送 for row in test_value: for num in row: # !I表示网络字节序的无符号int(4字节) packed_data = struct.pack("!I", num) sock.sendall(packed_data) sock.close()
2. 接收端:直接解析二进制字节流
接收时不需要做任何文本解码,直接收集字节数据,再用struct解包回unsigned int数组。
示例代码:
import socket import struct # 配置参数 ROW = 3 COLUMN = 4 TOTAL_ELEMENTS = ROW * COLUMN ELEMENT_SIZE = 4 # unsigned int占4字节 # 创建socket监听 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(("本地IP地址", 监听端口)) sock.listen(1) conn, addr = sock.accept() # 接收所有数据 received_bytes = b"" while len(received_bytes) < TOTAL_ELEMENTS * ELEMENT_SIZE: chunk = conn.recv(1024) if not chunk: break received_bytes += chunk # 解析成二维数组 result = [] offset = 0 for _ in range(ROW): current_row = [] for _ in range(COLUMN): # 解包单个unsigned int num = struct.unpack("!I", received_bytes[offset:offset+ELEMENT_SIZE])[0] current_row.append(num) offset += ELEMENT_SIZE result.append(current_row) # 关闭连接 conn.close() sock.close() # 验证结果 print("解析后的数组:", result)
如果必须用ISO-8859-1处理(不推荐)
如果因为某些限制必须用ISO-8859-1解码,一定要确保解码后再转回字节流,再进行数值解析,不能直接对解码后的字符串操作:
# 接收字节后 str_data = received_bytes.decode("iso-8859-1") # 转回字节流 byte_data = str_data.encode("iso-8859-1") # 然后再用struct解包,步骤和上面接收端一致
这种方式完全是绕弯路,直接处理字节流更高效也更不容易出错。
内容的提问来源于stack exchange,提问作者upasana
相关产品推荐
相关产品推荐

