Octave与Python TCP Socket接收FPGA比特流:如何匹配uint8数据类型?
关于Octave与Python TCP接收FPGA比特流的类型匹配问题
我在Octave和Python中通过TCP/IP Socket接收FPGA板的比特流:
- 在Octave中,使用代码:
[data_tcp1,len_tcp]=recv(client_tcp, 70848, MSG_WAITALL);
接收的数据维度为70848,数据类型为uint8(无符号字节数值数组)。
- 在Python中,初始尝试代码:
data_tcp1 = client_tcp.recv(70848)# data in byte
得到的数据大小同样是70848,但类型为<class 'bytes'>。我尝试了几种decode方式,想匹配Octave的结果:
data_tcp1 = client_tcp.recv(70848).decode('ISO-8859-1')
data = client_tcp.recv(70848).decode('utf-8', 'ignore')
data = client_tcp.recv(70848).decode()
各decode命令的区别
decode('ISO-8859-1'):ISO-8859-1是单字节字符编码,每个字节会直接映射为对应ASCII字符(范围0-255)。转换后得到字符串类型,字符编码值与原字节值一致,但本质是文本而非数值数组,完全没必要为二进制比特流做此转换。decode('utf-8', 'ignore'):UTF-8是多字节编码,FPGA传来的二进制比特流大概率不符合UTF-8规则,ignore参数会直接丢弃非法字节,导致数据丢失,完全不适合处理二进制数据。decode():默认使用UTF-8编码,无容错参数时,遇到不符合UTF-8的字节会直接抛出UnicodeDecodeError异常,同样不适合处理二进制比特流。
实现与Octave一致行为的正确做法
Octave的uint8是无符号字节数值数组,Python的bytes是字节序列,需转换成数值数组才能匹配Octave结果。推荐两种方式:
- 依赖numpy转换(最贴合Octave的数组形式):
import numpy as np # 接收字节数据 data_tcp1 = client_tcp.recv(70848) # 转换为uint8数组,与Octave结果完全一致 uint8_data = np.frombuffer(data_tcp1, dtype=np.uint8)
- 无依赖的列表推导式转换:
data_tcp1 = client_tcp.recv(70848) uint8_data = [byte for byte in data_tcp1]
得到的列表每个元素都是0-255的整数,与Octave的uint8数组数值完全匹配。
内容的提问来源于stack exchange,提问作者fpga
相关产品推荐
相关产品推荐

