C#处理网络传输中不完整的数据流

1、背景

在读取byte数组的场景(例如:读取文件、网络传输数据)中,特别是网络传输的场景中,非常有可能接收了不完整的byte数组,在将byte数组转换时,因字符的缺失/增多,转为乱码。如下图所示

2、具体实现

在C#中有Decoder可供使用,其内部有换存(buffer),可以现将非完整的byte存储起来,等到后新的数据后,再拼接起来,形成完成的内容。具体代码及说明如下:

csharp 复制代码
// See https://aka.ms/new-console-template for more information
using System.ComponentModel;
using System.Text;

//初始化的字符串
string helloStr = "你好Ha";
Console.WriteLine(helloStr);

byte[] helloArray=Encoding.UTF8.GetBytes(helloStr);
Console.WriteLine("你好Ha对应的byte数组内容(十六进制):" + BitConverter.ToString(helloArray));


ArraySegment<byte> helloSegment= new ArraySegment<byte>(helloArray,0,4);
Console.WriteLine("若网络传输中先收到了前4个:"+BitConverter.ToString(helloSegment.ToArray()));
Console.WriteLine("转换为string会发现结果是不对的:"+Encoding.UTF8.GetString(helloSegment));

Console.WriteLine("下面是使用GetDecoder方法进行处理");
Decoder dncoder = Encoding.UTF8.GetDecoder();

int charCount= dncoder.GetCharCount(helloSegment, false);
Console.WriteLine("还是同样的前4个,判断收到了几个【完整】的字符:"+charCount);

Console.WriteLine("将前3位,加载到halfCharArray数组中");
char[] halfCharArray = new char[charCount];
dncoder.GetChars(helloSegment.ToArray(), 0, helloSegment.Count, halfCharArray, 0);

Console.WriteLine("解析完的字符是:"+ new string(halfCharArray));


ArraySegment<byte> otherHalfStr = new ArraySegment<byte>(helloArray, 4, 4);
Console.WriteLine("若网络传输中先收到了后4个:" + BitConverter.ToString(otherHalfStr.ToArray()));

//继续转换
//若能判断,本次接受的数据为最终的数据,则GetCharCount的第二个参数,应当设置为true,(强制清空Buffer,避免后续使用时影响后续的解析)
int otherCharCount = dncoder.GetCharCount(otherHalfStr, true);  
Console.WriteLine("缓存+新接受的字符数量:" + otherCharCount);
char[] ohterHalfCharArray = new char[otherCharCount];
dncoder.GetChars(otherHalfStr.ToArray(), 0, otherHalfStr.Count, ohterHalfCharArray, 0);
Console.WriteLine("解析完的字符是:" + new string(ohterHalfCharArray));

Console.Read();

以上代码运行后的结果,如图所示:

3、参考

官网的参考资料

相关推荐
wxin_VXbishe6 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
bugcome_com17 小时前
零基础入门C#:一篇搞懂核心知识点
c#
程序员敲代码吗21 小时前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
缺点内向1 天前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
喵叔哟1 天前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_930707781 天前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
初级代码游戏1 天前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
大空大地20261 天前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
kylezhao20191 天前
C#序列化与反序列化详细讲解与应用
c#
JQLvopkk1 天前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio