繁体   English   中英

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

[英]How to put a specific byte from a byte array into a single byte

我在这里有一个代码,其中我设置了一个字节[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个数字的随机密码。 dalmatinerRound是一个字节数组,长度为101个,包含字母,大写字母,0-9以及!“§$%&/()=?* +}] [{

谢谢

为什么不只使用(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是一个字符串数组,无论如何还是很有用的,因此您应该这样做。

您正在遍历合格字符的数组,我假设以“ ABC ...”开头,并且每个字符都在做某事。 通过while循环,您试图在缓冲区中生成x个字节的计数,但是直到完成后您才停止-在填充完缓冲区之前,您永远没有机会增加i

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

相反,您应该在目标buffer的字符索引i循环,在每次迭代中生成一个随机字符-只是想想如何手动进行此过程。

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

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

附带说明一下,有很多更好的方法可以生成所需的内容。 由于您拥有一个由所有有效字符组成的数组,因此您可以从中选择一个随机元素来获取密码数字(即,生成一个介于0和数组长度之间的随机数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM