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

3 篇文章 0 订阅
2 篇文章 0 订阅

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;
        }

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值