我完全不知道这里发生了什么。
我正在为教育目的创建加密算法。
这是我的代码的开头:
public static byte[] encrypt(byte[] block, byte[] cipher_key)
{
List<byte[]> debug_states = new List<byte[]>();
List<byte[,,]> debug_cubes = new List<byte[,,]>();
List<byte[]> debug_keys = new List<byte[]>();
byte[] extended_key = KeyScheduler.GetExtendedKey(cipher_key);
byte[] state = new byte[512];
byte[] key = new byte[512];
byte[,,] state_cube = new byte[8, 8, 8];
debug_states.Add(state);
debug_cubes.Add(state_cube);
debug_keys.Add(key);
for (short a = 0; a < 512; a++)
{
state[a] = (byte)(block[a] ^ cipher_key[a]);
}
for (short r = 0; r < 32; r++)
{
short i = 0;
debug_states.Add(state);
debug_cubes.Add(state_cube);
debug_keys.Add(key);
for (i = 0; i < 512; i++) {
key[i] = (byte)extended_key[(r * 512) + i];
}
if (r == 2) { throw new Exception(); }
当我抛出异常以便在此后不久检查变量时,它们都没有任何意义。例如,从我第一次将状态添加到debug_states列表时,它应该全部为零,但Visual Studio表示它是180,155,126,217 .....同样的事情也发生在状态多维数据集中。更奇怪的是,价值不能随机,因为每次运行程序时它们都是相同的,但我完全不知道它们来自哪里。 extended_key确实获得了正确的值,但仍然无法正常工作,请参阅下一段。
此外,每次我尝试更改其中一个变量时,它们都不会改变!在我的代码中,有一个for循环可以多次更改状态,状态多维数据集和键,并且每次都记录它们,但在每个调试条目中它们总是相同的。
到底发生了什么?
答案 0 :(得分:2)
数组是引用类型。当您将state
添加到debug_states
时,您正在添加参考。将变量本身视为指向内存块的指针。所有这一切意味着对state
的任何未来修改都将反映在无处不在,即您将在debug_states[0]
中看到它们,就像您一样。
state
(debug_states[0]
) 为0。后来,你这样做了:
// state (and, by extension, debug_states[0]) is all 0's
for (short a = 0; a < 512; a++)
{
state[a] = (byte)(block[a] ^ cipher_key[a]);
}
// state (and, by extension, debug_states[0]) is filled with values
不再满0,并且该突变反映在对state
数组的每个引用中。