我这里有一个代码,我设置一个字节[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; /()=?* +}] [{
感谢
答案 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到数组长度的随机数)。