为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
婷婷同学_ 2021-06-03 14:33:05
我想应用两个字节数组的 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                    {                    }                }
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如果一次 8 字节的方面对您来说效果很好,并且您确定需要额外的性能,则可以扩展该方法以单独覆盖剩余的字节 - 最多 7 个字节:


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

{

    // First XOR as many 64-bit blocks as possible, for the sake of speed

    fixed (byte* byteA = oldBlock)

    fixed (byte* byteB = newBlock)

    {

        long* ppA = (long*) byteA;

        long* ppB = (long*) byteB;


        int chunks = oldBlock.Length / 8;

        for (int p = 0; p < chunks; p++)

        {

            *ppA ^= *ppB;


            ppA++;

            ppB++;

        }

    }


    // Now cover any remaining bytes one byte at a time. We've

    // already handled chunks * 8 bytes, so start there.

    for (int index = chunks * 8; index < oldBlock.Length; index++)

    {

        oldBlock[index] ^= newBlock[index];

    }

}


查看完整回答
反对 回复 2021-06-05
  • 1 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信