C# 指针的使用 ref byte 转 byte 或 byte [] ref 与指针

2023-11-06

C# 不推荐用指针,但可以使用指针,同时在某些情况下又不得不使用指针,比如C#调用了C++的DLL,而经常会用到指针

下在介绍C#代码中使用指针:

1,首先要使用指针,先在要C#工程属性中设置 ( 右键工程名 -》属性-》生成 ) ”允许不安全代码“:

2,添加 引用 using System.IO;

3,工程中用到指针的针码段用 unsafe{ } 包住,如下:

unsafe
 {
       fixed ( byte* p = &buf )
       {
            using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.Read))
            {
                 ms.Read(tbuf, 0, tbuf.Length);
             }  
     }
}

4,设置 UnmanagedMemoryStream 的读写权限:FileAccess.Read ,FileAccess.Write ,FileAccess.ReadWrite 三种

如,从指针中读取内容到 Byte [] tbuf数组中。

using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.Read))
{
      ms.Read(tbuf, 0, tbuf.Length);
 }  

往指针中读写入  Byte [] tbuf数组中 内容。

using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.ReadWrite))
 {
      ms.Write(tbuf, 0, size);
 }

5,给下完整的实现例子

        public void write(ref Byte buf, Byte size)
        {
            Byte[] tbuf = new Byte[size];

            unsafe
            {
                fixed ( byte* p = &buf )
                {
                    using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.Read))
                    {
                        ms.Read(tbuf, 0, tbuf.Length);
                    }  
                }
            }
            serialPort1.Write(tbuf, 0, size);
            return;
        }

        public Byte read(ref Byte buf, Byte size, Byte mstimeout)
        {
            Byte[] tbuf = new Byte[10];
            DateTime now = DateTime.Now;
            int s,rc;
            do
            {
                rc = serialPort1.Read(tbuf, 0, size);
                if (rc == size)
                {
                    
                    unsafe
                    {
                        fixed ( byte* p = &buf )
                        {
                            using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.ReadWrite))
                            {
                                ms.Write(tbuf, 0, size);
                            }
                        }
                    }
                    ServoTest.Text = string.Format("{0:X02} {1:X02} {2:X02} {3:X02} {4:X02} {5:X02} {6:X02} {7:X02} {8:X02} {9:X02} ",
                        tbuf[0], tbuf[1], tbuf[2], tbuf[3],tbuf[4],tbuf[5],tbuf[6],tbuf[7],tbuf[8],tbuf[9]); 
                    return 0;
                }
                TimeSpan spand = DateTime.Now - now; 
                s = spand.Milliseconds; 

            }while (s < mstimeout);
            return 1;
        }

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 指针的使用 ref byte 转 byte 或 byte [] ref 与指针 的相关文章

随机推荐

  • 如何命令杀死yarn的作业

    yarn application kill 命令即可kill掉
  • php安装swoole扩展(linux)

    在Linux中php安装swoole扩展 相关环境 LAMP或LNMP开发环境 L 指linux A 指Apache M 指MySQL P 指PHP N 指Nginx 下载swoole wget c https github com swo
  • 33 KVM管理设备-配置虚拟机PCIe控制器

    文章目录 33 KVM管理设备 配置虚拟机PCIe控制器 33 1 概述 33 2 配置PCIe Root PCIe Root Port和PCIe PCI Bridge 33 2 1 简化配置方法 33 2 1完整配制方法 33 KVM管理
  • 提供许可证到期新通知!标签管理软件BarTender v2019 R5上线!

    BarTender在150多个国家 地区拥有成千上百的用户 在标签 条形码 证卡和 RFID 标记的设计和打印领域是全球首屈一指的软件 BarTender既可以单独运行 也可以与任何其他程序集成 几乎是所有按需打印或打标应用的完美解决方案
  • 【网络编程】---C++实现原始套接字捕获数据包

    C 实现原始套接字捕获数据包 引言 原始套接字与TCP套接字和UDP套接字的区别 原始套接字编程使用的场合 原始套接字的通信过程 1 基于原始套接字的数据发送过程 2 基于原始套接字的数据接收过程 创建原始套接字 常用协议定义列表 使用原始
  • 显著性检测的四种经典方法

    最近闲来蛋痛 看了一些显著性检测的文章 只是简单的看看 并没有深入的研究 以下将研究的一些收获和经验共享 先从最简单的最容易实现的算法说起吧 1 LC算法 参考论文 Visual Attention Detection in Video S
  • angualr学习笔记3-angular模型(model)

    AngularJS ng model 指令 ng model 指令用于绑定应用程序数据到 HTML 控制器 input select textarea 的值 ng model 指令 ng model 指令可以将输入域的值与 AngularJ
  • 执行yum软件包索引步骤报错

    解决 进入目录 cd etc yum repos d 执行rm rf删除所有 rm rf 然后 yum update 重新设置yum源 curl o etc yum repos d CentOS Base repo http mirrors
  • 生活总是不经意给你开个玩笑_你在开玩笑的故事吗

    生活总是不经意给你开个玩笑 In 1994 Vincent Connare who had previously designed type at Apple and Agfa Compugraphic was working at Mic
  • js 异步执行_webpack模块化原理-异步加载模块

    在上篇文章中 我们介绍了 webpack 同步加载模块的原理 这篇文章 我们来介绍一下 webpack 异步加载模块 异步加载模块 还是先做一些准备工作 首先定义一个依赖模块 math js math js 采用 ES6 module 导出
  • 人工智能交互革命:探索ChatGPT的无限可能 第4章 ChatGPT-智能客服

    第4章ChatGPT 智能客服 4 1智能客服的定义与发展 智能客服是一种利用人工智能技术 为客户提供在线服务和支持的解决方案 它能够通过自然语言处理 机器学习等技术 识别和理解客户的问题 并提供针对性的解决方案 智能客服可以通过多种渠道提
  • Ajax、fetch、axios的区别与优缺点;axios跨域问题

    背景 前端的技术发展速度非常的快 异步请求也是其重要的体现之一 从最早的原生XHR 再到JqueryAjax的统治时代 再到近来 fetch axios等技术也开始出现并大量投入使用 原生Ajax Ajax是指一种创建交互式网页应用的网页开
  • 【软件工程】概要设计说明书

    概要设计说明书 1引言 1 1编写目的 这篇文章的编写目的主要是为了开发此系统为系统做一个总体的结构设计 经评审后进一步细化 分别对每一模块进行详细细化的解决方案 接口和数据库等方面的设计 明确描述所有输入输出参数 类型逻辑算法以及调用关系
  • DS二叉排序树之查找

    题目描述 给出一个数据序列 建立二叉排序树 并实现查找功能 对二叉排序树进行中序遍历 可以得到有序的数据序列 输入 第一行输入t 表示有t个数据序列 第二行输入n 表示首个序列包含n个数据 第三行输入n个数据 都是自然数且互不相同 数据之间
  • u-boot常用命令

    u boot常用命令 查看u boot所支持的命令 查询命令 u boot版本 环境变量 板子相关信息 环境变量操作 内存操作 网络操作 EMMC和 SD卡操作 FAT 格式文件系统操作 EXT格式文件系统操作 ubi格式文件系统操作 bo
  • 汇编JMP语句 IP值和偏移量的问题。问题如下,我想知道IP值是怎么变化的。还有8086一条指令占个几字节啊

    汇编JMP语句 IP值和偏移量的问题 问题如下 我想知道IP值是怎么变化的 还有8086一条指令占个几字节啊 2011 10 16 22 26 干物虫子 分类 汇编语言 浏览404次 1 在0624单元内忧一条二字节JMP SHORT OB
  • Linux下连接Oracle数据库并进行一系列操作

    Linux下操作Oracle数据库 操作Oracle要确保服务器上已经安装了Oracle数据库 1 连接到有Oracle数据库的服务器 ssh 172 16 100 201 服务器IP 如图 2 根据提示 输入服务器root密码 输入无误即
  • 游戏服务端框架之配置与玩家数据库设计

    目录 背景 策划数据库的概念 用户数据库的概念 数据库ORM方案 配置数据库的设计
  • 虎牙SRE谈可观测:如何做到比用户和老板更早发现业务异常?

    一分钟精华速览 可观测能力是指在复杂的软件系统中能及时 准确感知到服务状态 特别是异常或故障的发生 确定异常的影响范围 异常部位边界 判定异常点位 并由相关人员或软件做出准确决策的能力 本文作者结合虎牙SRE实践及20余年架构 研发 运维经
  • C# 指针的使用 ref byte 转 byte 或 byte [] ref 与指针

    C 不推荐用指针 但可以使用指针 同时在某些情况下又不得不使用指针 比如C 调用了C 的DLL 而经常会用到指针 下在介绍C 代码中使用指针 1 首先要使用指针 先在要C 工程属性中设置 右键工程名 属性 生成 允许不安全代码 2 添加 引