如何通过Python socket读取32位整数?现有代码无法获取读取到的整数值
Python socket读取32位整数无法从memoryview获取值的解决方案
我使用如下代码段从Python socket中读取32位整数:
toread=4 buf = bytearray(toread) view = memoryview(buf) while toread: nbytes = connection.recv_into(view) toread-=nbytes按逻辑执行完上述代码后即可从view中读取到目标整数,但我直接打印
view无法获取到已读取的整数值,请问是什么原因,该如何处理?
原因分析
memoryview是Python对底层字节缓冲区的轻量引用封装,直接打印该对象只会输出内存地址类的标识信息,不会自动解析底层存储的二进制字节为整数格式- 你读取到的4字节是socket传输的原始二进制数据,默认是网络字节序(大端序)存储的整数值,就算直接打印底层的
bytearray对象,也只会输出十六进制字节或ASCII转义形式,不会自动转换为人类可读的整数
解决方法
你需要手动将二进制字节序列转换为整数,有两种常用实现方式:
方法1:使用int.from_bytes(推荐,代码更简洁)
直接传入buf或者view对象,指定对应的字节序和是否有符号即可:
# 大端序无符号32位整数转换 result = int.from_bytes(buf, byteorder='big', signed=False) print(result) # 若为有符号整数,修改signed参数即可 # result = int.from_bytes(buf, byteorder='big', signed=True) # 若传输方用小端序写入整数,修改byteorder参数即可 # result = int.from_bytes(buf, byteorder='little', signed=False)
方法2:使用struct模块解析
适合需要同时解析多个不同类型二进制数据的场景:
import struct # >I 对应大端序无符号32位整数,返回的是元组,取第一个元素即可 result = struct.unpack('>I', buf)[0] print(result) # 格式符对照表: # > 大端序 < 小端序 # I 无符号32位整数 i 有符号32位整数
内容的提问来源于stack exchange,提问作者zell
相关产品推荐
相关产品推荐

