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

Python TCP Socket发送整数,C#客户端接收数据异常问题

TCP Socket 整数传输不匹配问题的解决方案

你遇到的问题根源在于Python和C#的整数序列化方式完全不兼容:

  • Python把整数转成字符串(比如6570变成"6570"),再用UTF-8编码成字节数组发送,实际发送的是b'6','5','7','0'这四个字节。
  • C#却直接把收到的字节当作32位整数的二进制原始字节来解析,这两种字节格式完全不对应,所以得到的结果完全随机。

下面是两种可行的解决方法:

方法一:二进制序列化(推荐,适合传输数值型数据)

这种方式直接发送整数的二进制表示,需要统一字节序(通常用网络字节序,即大端序)。

Python发送端修改:

使用struct模块将整数打包成4字节的大端序二进制:

import struct

# ... 连接代码 ...

# 发送图片大小(二进制大端序)
imageSize = len(encodedImage)
# 打包成大端序的32位无符号整数('!'表示网络字节序,'I'对应无符号32位,有符号则用'i')
size_bytes = struct.pack('!I', imageSize)
socket.send(size_bytes)

C#接收端修改:

接收4字节数据,手动转换为大端序的整数(避免系统字节序差异影响跨平台兼容性):

// ... 连接代码 ...

// 接收整数(二进制大端序)
byte[] buffer = new byte[4]; // 32位整数固定占4字节
int bytesReceived = stream.Read(buffer, 0, buffer.Length);
if (bytesReceived != 4)
{
    throw new Exception("未接收到完整的整数数据");
}
// 大端字节序转本地整数
int imageSize = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];

方法二:字符串序列化(适合简单场景)

如果坚持用字符串传输,需要C#接收完整的字符串后再转换为整数:

Python发送端(建议添加结束标记方便识别):

# ... 连接代码 ...

imageSize = len(encodedImage)
# 添加换行符作为字符串结束标记,确保C#能读取完整内容
socket.send((str(imageSize) + "\n").encode("utf-8"))

C#接收端修改:

使用StreamReader读取完整字符串行后解析:

// ... 连接代码 ...

// 接收字符串并转换为整数
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
    string sizeStr = reader.ReadLine();
    if (int.TryParse(sizeStr, out int imageSize))
    {
        // 成功解析,使用imageSize
    }
    else
    {
        // 处理解析失败的情况
    }
}

内容的提问来源于stack exchange,提问作者Slash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:43:29