为何Xor操作存在长度限制?ASCII字符串超318字符时溢出报错
问题分析与解决
报错原因
这个错误不是数组大小限制导致的,而是计算逻辑中的类型溢出问题:
Rnd()返回Single类型的随机值,范围是[0, 1)(包含0,不包含1)256 * Rnd()的结果范围是[0, 256),当这个值非常接近256时(比如255.99999),直接赋值给Byte类型的c(i)会触发溢出——因为Byte的取值范围是0-255,无法容纳≥256的数值。- 字符串长度超过318时更容易触发报错,只是因为循环次数更多,碰到接近256的随机值的概率更高,和数组本身的大小限制无关。
修复方案
方案1:修正Rnd()的计算逻辑
把随机值转换为0-255之间的整数,避免溢出:
Dim c() As Byte = System.Text.Encoding.ASCII.GetBytes(stringdate) For i = 0 To c.Length - 1 ' 用Int()取整数部分,确保结果在0-255之间 c(i) = c(i) Xor CByte(Int(256 * Rnd())) Next IO.File.WriteAllBytes(Filename, c)
方案2:使用.NET原生的Random类(更推荐)
Rnd() 是VB6兼容的旧函数,.NET中更可靠的随机数生成方式是用 Random 类:
Dim rng As New Random() Dim c() As Byte = System.Text.Encoding.ASCII.GetBytes(stringdate) For i = 0 To c.Length - 1 ' 直接生成0-255之间的随机整数 c(i) = c(i) Xor CByte(rng.Next(0, 256)) Next IO.File.WriteAllBytes(Filename, c)
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

