C#byte []数组自动填充随机值

时间:2013-10-10 04:48:20

标签: c# arrays list byte

我完全不知道这里发生了什么。

我正在为教育目的创建加密算法。

这是我的代码的开头:

    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循环可以多次更改状态,状态多维数据集和键,并且每次都记录它们,但在每个调试条目中它们总是相同的。

到底发生了什么?

1 个答案:

答案 0 :(得分:2)

数组是引用类型。当您将state添加到debug_states时,您正在添加参考。将变量本身视为指向内存块的指针。所有这一切意味着对state的任何未来修改都将反映在无处不在,即您将在debug_states[0]中看到它们,就像您一样。

第一次添加时,

statedebug_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数组的每个引用中。