如何将字节数组中的特定字节放入单个字节

时间:2014-01-07 09:33:09

标签: c#

我这里有一个代码,我设置一个字节[1]来填充一个随机字节,然后我需要将这个随机生成的字节从数组[0]转换成一个字节,以便能够比较它。 (x为16或32,z始终以0开始)

byte compareByte = 0x00;
byte[] rndByte = new byte[1];
byte[] buffer = new byte[x];
Random rnd = new Random();

for (int i = 0; i < dalmatinerRound.Length; i++)
{
    while (z != x)
    {
        Application.DoEvents();
        rnd.NextBytes(rndByte);
        compareByte = (byte) rndByte[0];

        if (compareByte == dalmatinerRound[i])
        {
            buffer[z] = compareByte;
            z++;

            if (z == x)
            {
                string str = Encoding.ASCII.GetString(buffer);
                textPass.Text = str;
            }
        }
    }
}

问题是compareByte每次都是“A”。无论我多么经常。或者即使我使用随机字节进行比较,如:

if (rndByte[0] == dalmatinerRound[i])

它也会返回“A”。我无法将数组偏移量0x00的字节转换为单个字节。 但是当我做一些测试和使用时:

string str = Encoding.ASCII.GetString(rndByte);
textPass.Text = str;

然后它起作用,我每次都得到另一封信。 更清楚。此代码将生成长度为16或32 diggis的随机密码。 dalmatinerRound是一个长度为101的字节数组,用于按字母顺序排列的字母,小写和大写,0-9以及!“§$%&amp; /()=?* +}] [{

感谢

3 个答案:

答案 0 :(得分:1)

为什么不使用(byte)rnd.Next(0,256)?在任何情况下,rnd.NextBytes都可以正常工作,你可以按照你的方式使用rndByte [0]获得第一个字节。换句话说,错误必须在其他地方,而不是在随机生成器或读取字节值。这真的是代码,还是你做了一些改变?无论如何,您的代码看起来非常复杂和浪费。你应该只使用你允许的值数组(不需要它有一个字节数组,字符更有用)并使用rnd.Next(0,dalmatinerRound.Length);获得随机允许的角色。

你的代码实际上做的是它循环,直到你得到一个“随机”字节...等于(字节)'A'。你的循环都错了。相反,你可以使用它:

StringBuilder pwd = new StringBuilder(wantedLength);

for (var i = 0; i < wantedLength; i++)
   pwd.Append(dalmatinerRound[rnd.Next(0, dalmatinerRound.Length)]);

你有随机密码:)

这要求dalmatinerRound是一个字符串数组,无论如何都非常有用,所以你应该这样做。

答案 1 :(得分:0)

你正在遍历符合条件的角色数组,我假设开始“ABC ...”,并为每个做某事的人开始。使用while循环,您尝试在缓冲区中生成x个字节的计数,但在完成此操作之前不会停止 - 在完成填充之前,您永远不会有机会增加i缓冲区。

如果恰好是dalmatinerRound中的当前“候选”字符,您还会生成一个随机字节并仅将其添加到缓冲区。因此缓冲区缓慢地填满了“A”字符。然后,当它已满时,下一次i递增,while循环立即退出,因此不会尝试其他字符。

您应该在目标i中循环遍历字符索引buffer,在每次迭代中生成一个随机字符 - 只需考虑如何手动执行此过程。

答案 2 :(得分:0)

看起来您的for循环位置错误。目前,整个密码是在for循环的第一次(可能是唯一的)迭代中生成的。这意味着您的比较只会将随机字节与dalmatinerRound中的第一个条目进行比较,这可能是字母A.

您需要将for循环放在while循环中,以便将每个随机字节与dalmatinerRound的每个元素进行比较。 (确保在生成随机字节后放置循环!)

作为旁注,有更好的方法来产生你需要的东西。由于你有一个所有有效字符的数组,你可以从中选择一个随机元素来获得一个密码数字(即生成一个0到数组长度的随机数)。