【发布时间】:2017-01-11 09:33:43
【问题描述】:
我对 byte[] 使用 XOR 操作
public static byte[] XOR(byte[] buffer1, byte[] buffer2)
{
for (int i = 0; i < buffer1.Length; i++)
buffer1[i] ^= buffer2[i];
return buffer1;
}
并实现散列算法的移位方法。
public static byte[] RotHi(byte[] B, int count)
{
for (int i = 0; i < count; i++)
{
byte[] a = ShHi(B);
byte[] b = B;
for (int j = (B.Length * 8) - 2; j >=0 ; j--)
{
b = ShLo(b);
}
B = XOR(a,b);
}
return B;
}
public static byte[] ShHi(byte[] B)
{
return BitConverter.GetBytes(BitConverter.ToUInt64(B, 0) >> 1);
}
public static byte[] ShLo(byte[] B)
{
return BitConverter.GetBytes(BitConverter.ToUInt64(B, 0) << 1);
}
当它单独工作时,结果是正确的
W0 = b194bac80a08f53b.
W1 = e12bdc1ae28257ec.
W2 = e9dee72c8f0c0fa6.
m1 = 8; n1 = 53.
T0 = RotHi(W0, m1); // 3bb194bac80a08f5
W0 = XOR(W0,W1);
W0 = XOR(W0,W2); // b96181fe6786ad71
但是下一个代码返回结果^
T1 = XOR(W1,(RotHi(W0, n1))); // ed242f26d7e9da27, but should be CDFB23D652B779DB
怎么了?
【问题讨论】:
-
这与 C++ 有什么关系?你显然不是在用 C++ 编程,所以请不要添加无关的语言标签。
-
至于您的问题,您是否尝试过在调试器中单步执行代码?您期望的值和您得到的值何时何地开始偏离?你确定期望值是正确的吗?你确定你的算法是正确的吗?
-
你使用 n1 而不是 m1 并且只做第一个 xor 而不是第二个,所以答案会有所不同。在你抱怨它们给出两个不同的答案之前,请让这两个计算相等。
-
@Someprogrammerdude 不,我不知道。但结果 T0 和 W0 是对的。
-
@prof1990 它不等价,它是不同的变量和不同的操作。但只有第三个结果是错误的(参考标准)
标签: c# arrays algorithm boolean-logic