You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:15:08