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

第1个回答  2015-05-27

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

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

本回答被网友采纳
第2个回答  2015-05-27
不需要指针,数组就可以了
headTag = data[0];
iPacketLen = (data[1]<<8) | data[2];追问

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

追答

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

追问

问题还没有解决,继续ing

追答

移位有问题吗?

追问

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

相似回答