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);
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);
指针的高效不是体现在这种事上的,而且托管代码和非托管代码的转换也是要损失一部分的性能的。
headTag = data[0];
iPacketLen = (data[1]<<8) | data[2];追问
不能按位移动,否则值就不对了
追答data[1]<<8并不会改变data[1]的值
追问问题还没有解决,继续ing
追答移位有问题吗?
追问谢谢您,虽然没有使用位移,但还是拓展了我的思路。
最后的解决方案在我的问题后面(对百度知道还不太熟)。
以上是关于c#拷贝数组指针中的元素到变量中的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )