如何在 C# 中使用 Buffer

缓冲区 是内存中的一组字节序列,缓冲 是用来处理落在内存中的数据,.NET 缓冲 指的是处理 非托管内存 中的数据,用 byte[] 来表示。

当你想把数据写入到内存或者你想处理非托管内存中的数据,可以使用 .NET 提供的 System.Buffer类,这篇文章就来讨论如何使用 Buffer。

Buffer 下的方法列表

Buffer 类包含了下面几个方法:

  • BlockCopy(Array, Int32, Array, Int32)

用于将指定位置开始的 原数组 copy 到 指定位置开始的 目标数组。

  • ByteLength(Array)

表示数组中 byte 字节的总数。

  • GetByte(Array, Int32)

在数组一个指定位置中提取出一个 byte。

  • SetByte(Array, Int32, Byte)

在数组的一个指定位置中设置一个 byte。

  • MemoryCopy(Void*, Void*, Int64, Int64)

从第一个源地址上copy 若干个byte 到 目标地址中。

理解 Array 和 Buffer

在了解 Buffer 之前,我们先看看 Array 类,Array 类中有一个 Copy() 方法用于将数组的内容 copy 到另一个数组中,在 Buffer 中也提供了一个类似的 BlockCopy() 方法和 Array.Copy() 做的一样的事情,不过 Buffer.BlockCopy() 要比 Array.Copy() 的性能高得多,原因在于前者是按照 byte 拷贝,后者是 content 拷贝。

数组之间的 bytes copy

你可以利用 Buffer.BlockCopy() 方法 将源数组的字节 copy 到目标数组,如下代码所示:


static void Main()
{short [] arr1 = new short[] { 1, 2, 3, 4, 5};short [] arr2 = new short[10];int sourceOffset = 0;int destinationOffset = 0;int count = 2 * sizeof(short);Buffer.BlockCopy(arr1, sourceOffset, arr2, destinationOffset, count);for (int i = 0; i < arr2.Length; i++){Console.WriteLine(arr2[i]);}Console.ReadKey();
}

如果没看懂上面输出,我稍微解释下吧,请看这句:int count = 2 * sizeof(short) 表示从 arr1 中 copy  4个字节到 arr2 中,而 4 byte = 2 short,也就是将 arr1 中的 {1,2} copy 到 arr2 中,对吧。

理解数组中字节总长度

要想获取数组中的字节总长度,可以利用 Buffer 中的 ByteLength 方法,如下代码所示:


static void Main()
{short [] arr1 = new short[] { 1, 2, 3, 4, 5};short [] arr2 = new short[10];Console.WriteLine("The length of the arr1 is: {0}",Buffer.ByteLength(arr1));Console.WriteLine("The length of the arr2 is: {0}",Buffer.ByteLength(arr2));Console.ReadKey();
}

从图中可以看出,一个 short 表示 2 个 byte, 5个 short 就是 10 个 byte,对吧,结果就是 short [].length * 2,所以 Console 中的 10 和 20 就不难理解了,接下来看下 Buffer 的 SetByte 和 GetByte 方法,他们可用于单独设置和提取数组中某一个位置的 byte,下面的代码展示了如何使用 SetByte 和 GetByte。

static void Main(){short[] arr1 = { 5, 25 };int length = Buffer.ByteLength(arr1);Console.WriteLine("\nThe original array is as follows:-");for (int i = 0; i < length; i++){byte b = Buffer.GetByte(arr1, i);Console.WriteLine(b);}Buffer.SetByte(arr1, 0, 100);Buffer.SetByte(arr1, 1, 100);Console.WriteLine("\nThe modified array is as follows:-");for (int i = 0; i < Buffer.ByteLength(arr1); i++){byte b = Buffer.GetByte(arr1, i);Console.WriteLine(b);}Console.ReadKey();}

Buffer 在处理 含有基元类型的一个内存块上 具有超高的处理性能,当你需要处理内存中的数据 或者 希望快速的访问内存中的数据,这时候 Buffer 将是一个非常好的选择。

译文链接:https://www.infoworld.com/article/3587751/how-to-use-the-buffer-class-in-c.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET SDK-Style 项目(Core、Standard、.NET5)中的版本号

.NET SDK-Style 项目&#xff08;Core、Standard、.NET5&#xff09;中的版本号独立观察员 2020 年 12 月 24 日之前 .NET Framework 时&#xff0c;项目版本号等信息是存储在 AssemblyInfo.cs 文件中&#xff0c;通过程序集特性进行设置&#xff1a;.NET Core 之后&#xff0c…

[Stardust]星尘分布式全链路监控

随着业务的发展&#xff0c;微服务系统会变得越来越大&#xff0c;各个服务之间的调用关系也会日趋复杂。一个WebApi请求&#xff0c;后方可能经历多个微服务以及数据库和MQ操作&#xff0c;在这个调用过程中&#xff0c;可能因为某一个服务节点出现延迟或者失败&#xff0c;而…

如何在 C# 中使用 const,readonly,static

平时在开发时经常会用到 const,readonly,static 关键字&#xff0c;可以肯定这些关键词是完全不同的概念&#xff0c;但有时候他们在用法上很相似以至于在场景中不知道选择哪一个&#xff0c;这篇文章我们就来讨论 C# 中的 const&#xff0c;static 和 readonly 关键词&#xf…

2020,你收获了什么?又失去了什么?

这是头哥侃码的第228篇原创今天是圣诞节&#xff0c;既魔幻又真实的2020年&#xff0c;还有6天就要结束了。每年的年末&#xff0c;我都习惯在下班途中&#xff0c;把头靠在地铁车厢两侧的扶手上&#xff0c;闭上眼睛开始思考自己过去一年的收获与得失&#xff0c;并把这些思绪…

2019龙少php泛站群,龙少php泛站群|PHP版站群 全自动泛解析站群程序 赠送教程

首先将准备建站的域名设置泛解析如baidu.com泛解析为 添加A记录为 *.baidu.com然后在iis里添加空头主机不能设置 汉字目录keywords.txt 关键字&#xff0c;一行一个domain.txt 域名&#xff0c;一行一个&#xff0c;*代表随机muban.html 模板文件&#xff0c;可以修改缓存在dat…

轻量级消息队列RedisQueue

消息队列&#xff08;Message Queue&#xff09;是分布式系统必不可少的中间件&#xff0c;大部分消息队列产品&#xff08;如RocketMQ/RabbitMQ/Kafka等&#xff09;要求团队有比较强的技术实力&#xff0c;不适用于中小团队&#xff0c;并且对.NET技术的支持力度不够。而Redi…

生态和能力是国内自研操作系统发展的关键

“缺芯少魂”一直是我国信息产业短板&#xff0c;如果无法实现国产化替代&#xff0c;信息安全和产业安全就犹如沙滩上盖房子&#xff0c;上层再坚固&#xff0c;地基不稳&#xff0c;一遇到风吹草动就有可能全部垮掉。近年来&#xff0c;国内自研操作系统厂商动作频频&#xf…

matlab群延时函数,群延迟函数(group delay function)群延迟滤波器 | 学步园

最近看了许多介绍Group delay function的论文&#xff0c;文章中大篇幅提到Group delay&#xff0c;group delay of digital filters,对这个方面的知识好像还挺有用的&#xff0c;所以想把它记录下来。然后总结下计算Group delay function的步骤。假设有N个样本的脉冲响应为h(n…

怎样使用C# 获取WIFI的连接状态?

怎样使用C# 获取WIFI的连接状态&#xff1f;行文导航思路问题得到解决代码展示断开与连接WIFI状态效果在OrangePI Linux Arm32上的测试效果C# 获取WIFI的连接状态本文是在知道WIFI网络设备名称的情况下&#xff0c;获取该设备的连接状态&#xff0c;同样也是可以判断是否已连接…

如何在 ASP.NET Core 中使用 URL Rewriting 中间件

URL rewriting 是根据预先配置好的一组规则去修改 request url&#xff0c;值得注意的是&#xff1a;URL Rewriting 的重写功能和 url 重定向 是两个概念&#xff0c;本篇我们就来讨论下如何在 ASP.NET Core 中对 url 进行 rewriting。安装 URL Rewriting 中间件 要想使用 URL …

睡眠分期matlab代码,非接触式睡眠分期方法与流程

本发明属于雷达监测技术领域&#xff0c;特别是一种非接触式睡眠分期方法。背景技术&#xff1a;传统的呼吸睡眠监护系统主要依靠贴附于人体的接触式传感器、电极进行测量&#xff0c;从而实时获得人体的生命参数信号&#xff0c;这些方法都需要直接或间接地接触人体&#xff0…

叮咚!你有一份来自明源云的圣诞邀约

请查收&#xff0c;来自明源云的圣诞邀约&#xff5e;

java先进先出 循环队列,JavaScript队列、优先队列与循环队列

队列是一种遵从先进先出(FIFO)原则的有序集合队列在尾部添加新元素&#xff0c;从顶部移除元素队列的理解队列在我们生活中最常见的场景就是排队了队列这个名字也已经很通俗易懂了和栈很像&#xff0c;这不过队列是先入先出的数据结构队列的前面是队头队列的后面是队尾出队从队…

Abp小试牛刀之 图片上传

图片上传是很常见的功能&#xff0c;里面有些固定的操作也可以沉淀下来。本文记录使用Abp vNext做图片上传的姿势。目标上传图片----->预览图片----->确定保存支持集群部署实现思路&#xff1a;1. 上传图片要使用WebAPI特定媒体类型&#xff1a;multipart/form-data;2. 因…

.Net Conf 2020 之回顾

Intro上周 .NET Conf 在苏州成功举办了第二届活动&#xff0c;一年一度的 .NET 盛会又来了&#xff0c;今年大会依然有许多从外地过来参加的开发者们&#xff0c;也有很多讲师也是从外地赶过来为我们分享。虽然今年是疫情的一年&#xff0c;并没有影响 .NET Conf 参会者们的热情…

如何使用 C# 在异步代码中处理异常

异常处理是一种处理运行时错误的技术&#xff0c;而 异步编程 允许我们在处理资源密集型的业务逻辑时不需要在 Main 方法或者在 执行线程 中被阻塞&#xff0c;值得注意的是&#xff0c;异步方法和同步方法的异常处理机制是不一样的&#xff0c;本篇我们就来讨论下如何在异步方…

对 Redis 中的有序集合SortedSet的理解

本篇说一下Redis中的 有序集合类型&#xff0c;曾几何时&#xff0c;我们想把所有数据存到内存中的 数据结构 中&#xff0c;但为了多机器共享内存&#xff0c;不得不将这块内存包装成wcf单独部署&#xff0c;同时还要考虑怎么序列化&#xff0c;烦心事太多太多。。。后来才知道…

代码质量在「内卷时代」的重要性

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「173」篇原创敬上大家好&#xff0c;我是Z哥。提到代码质量&#xff0c;不知道你的脑海中浮现出的第一个词是什么&#xff1f;规范&#xff1f;可读性&#xff1f;…

.NET Core AWS S3云存储

【导读】最近有需要用到AWS S3云存储上传附件&#xff0c;这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录&#xff0c;或许能对后续有用到的童鞋提供一点帮助Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务&#xff0c;提供行业领先的可…

MiniProfiler,一个.NET简单但有效的微型分析器

背景MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC的性能分析的小程序。可以对一个页面本身&#xff0c;及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容&#xff0c;并可以显示数据库访问的SQL&#xff08;支持EF、EF …