我对TCP套接字是个新手,我正在try 使用Python(服务器)来发送带有TCP套接字的编码图像(整数)的大小.使用C#WinForms应用程序(客户端)来接收这个整数,但是接收到的int看起来非常随机.例如,如果编码图像为6570,则C#应用程序接收808924470

Python代码(发送方):

## Connection code...

# Send image size
imageSize = len(encodedImage)
socket.send(str(imageSize).encode("utf-8"))

C#代码(接收器):

// Connection code...

// Receive int
byte[] buffer = new byte[1024];
int bytesReceived = stream.Read(buffer);
int imageSize = BitConverter.ToInt32(buffer, 0);

推荐答案

Python代码将以UTF字符串数据的形式发送该值,即6570将是字节(十六进制)36-35-37-30.你需要这样做才能达到decode this.

例如,最有效的办法是:

var bytes = new byte[] { 0x36, 0x35, 0x37, 0x30 };
if (System.Buffers.Text.Utf8Parser.TryParse(bytes, out int value, out int bytesUsed))
{
    Console.WriteLine($"Read {value} from {bytesUsed} bytes");
}

(您也可以使用Encoding.UTF8将字节解析为string,然后使用int.Parsestring解析为intUtf8Parser用于跳过中间的string)

然而,您还需要考虑"成帧";TCP是流协议,而不是消息协议.仅仅拨打Read是不够的——这可能是半条消息(只有65),一条完整的消息,或57条完整的消息和58条的一半.对于文本协议来说,涉及断点的内容是常见的.


为了完整性(为了理解现有代码正在做什么),BitConverter.ToInt32正在执行CPU端的"双关语",(reinterpret—cast)字节到原始整数;由于您的CPU很可能是little—endian,因此这是整数0x30373536(请记住,UTF8字节是十六进制36—35—37—30,小字节顺序颠倒了感知的字节顺序),也就是十进制808924470.

Python相关问答推荐

Pydantic 2.7.0模型接受字符串日期时间或无

try 与gemini-pro进行多轮聊天时出错

如何将双框框列中的成对变成两个新列

Python上的Instagram API:缺少client_id参数"

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

从numpy数组和参数创建收件箱

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

PyQt5,如何使每个对象的 colored颜色 不同?'

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

在ubuntu上安装dlib时出错

使用特定值作为引用替换数据框行上的值

从旋转的DF查询非NaN值

Polars map_使用多处理对UDF进行批处理

仅使用预先计算的排序获取排序元素

如何在信号的FFT中获得正确的频率幅值

从列表中分离数据的最佳方式

当lambda函数作为参数传递时,pyo3执行

将参数从另一个python脚本中传递给main(argv

如何有效地计算所有输出相对于参数的梯度?