c# 在字节数组上应用 64 位 XOR

我想应用两个字节数组的 64 XOR 操作。这是正确的使用方法吗unsafe


我尝试了以下方法而不使用 unsafe. 但我想要比这快一点


for (int i=0; i< oldBlock.Length;i++)

{

{

 oldblock[i] ^= (newblock[i]);

}

下面的 XOR 操作错过了最后一个字节,如下代码每次 XOR 8 个字节。


如何实现这一点。


static void Main(string[] args)

        {



            byte[] a = new byte[10];

            byte[] b = new byte[10];

            Random r = new Random();

            r.NextBytes(a);

            a.CopyTo(b, 0);

            XOr64(a, b);

            foreach (byte c in a)

            {

                Console.WriteLine(c);

            }



            Console.ReadKey();




        }    


public static unsafe void XOr64(byte[] oldBlock, byte[] newblock)

                {

                    try

                    {

                        fixed (byte* byteA = oldBlock)

                        fixed (byte* byteB = newblock)

                        {

                            long* ppA = (long*)byteA;

                            long* ppB = (long*)byteB;


                            for (int p = 0; p < oldBlock.Length/8; p++)

                            {

                                *ppA ^= *ppB;


                                ppA++;

                                ppB++;

                            }

                        }

                    }

                    catch

                    {


                    }




                }


婷婷同学_
浏览 188回答 1
1回答

缥缈止盈

如果一次 8 字节的方面对您来说效果很好,并且您确定需要额外的性能,则可以扩展该方法以单独覆盖剩余的字节 - 最多 7 个字节:public static unsafe void XOr64(byte[] oldBlock, byte[] newBlock){&nbsp; &nbsp; // First XOR as many 64-bit blocks as possible, for the sake of speed&nbsp; &nbsp; fixed (byte* byteA = oldBlock)&nbsp; &nbsp; fixed (byte* byteB = newBlock)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; long* ppA = (long*) byteA;&nbsp; &nbsp; &nbsp; &nbsp; long* ppB = (long*) byteB;&nbsp; &nbsp; &nbsp; &nbsp; int chunks = oldBlock.Length / 8;&nbsp; &nbsp; &nbsp; &nbsp; for (int p = 0; p < chunks; p++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *ppA ^= *ppB;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ppA++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ppB++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; // Now cover any remaining bytes one byte at a time. We've&nbsp; &nbsp; // already handled chunks * 8 bytes, so start there.&nbsp; &nbsp; for (int index = chunks * 8; index < oldBlock.Length; index++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; oldBlock[index] ^= newBlock[index];&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP