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)你可以试试位操作运算符 << 、>>
recv=data[0]<<24|data[1]<<16|data[2]<<8;
追问使用指针,主要是考虑效率问题
结果你最后用的方法 还是不需要用到指针。
byte[] data=new byte[]{1,2,3};指针的高效不是体现在这种事上的,而且托管代码和非托管代码的转换也是要损失一部分的性能的。
不能按位移动,否则值就不对了
追答data[1]<<8并不会改变data[1]的值
追问问题还没有解决,继续ing
追答移位有问题吗?
追问谢谢您,虽然没有使用位移,但还是拓展了我的思路。
最后的解决方案在我的问题后面(对百度知道还不太熟)。