如何在 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,一经查实,立即删除!

相关文章

php强制对齐,[强迫症福利] 使用 PHPStorm 对齐数组的键值对

用 php-cs-fixer 自动格式化&#xff0c;一个配置配合 Git 自动格式化&#xff0c;补充楼上。示例 Git Hook忽略前端的代码格式化&#xff0c;修改一下就可以用。#!/bin/bash## check PHP code syntax error and standard with phpcs# https://blog.csdn.net/xsgnzb/article/de…

.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…

ajax php 动态,jQuery+PHP+Ajax实现动态数字统计展示功能

jQueryPHPAjax实现的一款动态数字统计展示实例&#xff0c;本例是在页面上动态展示了当前在线用户数&#xff0c;当然了&#xff0c;你可以应用到其他更多场景中。首先我们在#number放置要统计的数字&#xff1a;当前在线&#xff1a;然后我们要定义一个动画过程&#xff0c;使…

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

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

php去掉查询返回的字段序列,php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回...

array_slice()定义和用法array_slice() 函数在数组中根据条件取出一段值&#xff0c;并返回。注释&#xff1a;如果数组有字符串键&#xff0c;所返回的数组将保留键名。(参见例子 4)语法array_slice(array,offset,length,preserve)参数 描述array 必需。规定输入的数组。offse…

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

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

php html asp .net iis tomcat,iis+apache+tomcat 整合共享80口 支持ASP .NET JSP PHP全能WEB服务...

文件目录说明&#xff1a;[apache-tomcat-6.0.37-windows-x86] tomcat 安装版与解压版文件[httpd-2.2] apache安装文件[java] jdk与jre安装文件[mysql] mysql与mysql-tool安装文件[php-5.2.14-Win32] php解压文件[tomcat-connectors-1.2.14-isapi-iis-6.0] isapi模块安装文件[t…

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…

php下载文件代码 数据库,PHP备份数据库生成SQL文件并下载的函数代码

. 代码如下:/****** 备份数据库结构 ******//*函数名称&#xff1a;table2sql()函数功能&#xff1a;把表的结构转换成为SQL函数参数&#xff1a;$table: 要进行提取的表名返 回 值&#xff1a;返回提取后的结果&#xff0c;SQL集合函数作者&#xff1a;heiyeluren*/function t…

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

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

php curl 使用方法,php curl使用方法与步骤

本书特别新手的一点&#xff0c;是将重要操作的核心思路都为大家提供了。在数据库、图片、文件上传我们都把真正的步骤。以及步骤如何组何成为我们的代码和实现过程都做过讲解。我们将curl的步骤分为以下7步&#xff1a;1.初使化curl资源2.参数设置请求的协议地址3.参数设置是否…

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…

self php语法,PHP代码审计之关于PHP_SELF的简单利用

这两天突然看到 https://blog.ripstech.com/2020/sql-injection-impresscms/&#xff0c;想着复现一下&#xff0c;记录一下学习过程。漏洞分析漏洞复现首先我们先下载安装一下这个 cms&#xff0c;然后直接访问&#xff1a;http://127.0.0.1:81/admin.php/modules/system and …

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

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

使用Select.HtmlToPdf 把html内容生成pdf文件

概述.NET的SelectPdf Html到Pdf转换器-社区版是.NET的SelectPdf库中提供的功能强大的html到pdf转换器的免费版本。转换器提供了许多强大的选项&#xff08;将任何网页转换为pdf&#xff0c;将任何html字符串转换为pdf&#xff0c;html5 / css3 / javascript支持&#xff0c;页眉…