c#拷贝数组指针中的元素到变量中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#拷贝数组指针中的元素到变量中相关的知识,希望对你有一定的参考价值。

unsafe void UnpackPacket(byte[] data, int recv)

Int16 headTag = 0;
Int32 iPacketLen = 0;
fixed (byte* p = data)

//从指针 p 中拷贝第1个字节到 headTag
//从指针 p 中拷贝第2和第3个字节到 iPacketLen



还是贴个图吧,我是想把第一个元素和第二个元素的值(共两个字节)拷贝到一个变量中,所以才使用了指针,以便操作内存地址。
@Irh3321
我采用的另一种方法:
UInt16 uPacketLen = 0;
fixed (byte* pBuf = arrs)

byte* p = pBuf;
p = p + 1;
byte[] bytes = new byte[2];
Marshal.Copy(new IntPtr(p), bytes, 0, 2);
Array.Reverse(bytes);
uPacketLen = BitConverter.ToUInt16(bytes, 0);

参考技术A

C#不建议直接用指针的。。。

         unsafe void UnpackPacket(byte[] data, int recv)
        
            Int16 headTag = 0;
            Int32 iPacketLen = 0;
            fixed (byte* p = data)
            
                headTag= *p;
                short * p2=( short *)p+1;//short型占两字节
                iPacketLen =* p2;
                //从指针 p 中拷贝第1个字节到 headTag
                //从指针 p 中拷贝第2和第3个字节到 iPacketLen
            
        

你可以试试位操作运算符 << 、>>

 recv=data[0]<<24|data[1]<<16|data[2]<<8;

追问

使用指针,主要是考虑效率问题

追答

结果你最后用的方法 还是不需要用到指针。

             byte[] data=new byte[]1,2,3;
            byte[] bytes = new byte[2];
            Array.Copy(data,1,bytes,0,2);
            Array.Reverse(bytes);
            uPacketLen = BitConverter.ToUInt16(bytes, 0);

指针的高效不是体现在这种事上的,而且托管代码和非托管代码的转换也是要损失一部分的性能的。

参考技术B 不需要指针,数组就可以了
headTag = data[0];
iPacketLen = (data[1]<<8) | data[2];追问

不能按位移动,否则值就不对了

追答

data[1]<<8并不会改变data[1]的值

追问

问题还没有解决,继续ing

追答

移位有问题吗?

追问

谢谢您,虽然没有使用位移,但还是拓展了我的思路。
最后的解决方案在我的问题后面(对百度知道还不太熟)。

以上是关于c#拷贝数组指针中的元素到变量中的主要内容,如果未能解决你的问题,请参考以下文章

指针与数组

指针与数组

C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )

《C语言程序设计》指针

《C语言程序设计》指针

C#中字节数组的递增指针