值过大或过小,无法用无符号字节表示。

6

遇到了以下错误:

System.OverflowException已被抛出 - 值对于无符号字节来说要么太大,要么太小。

有人知道怎么解决吗?

class MainClass
{
    public static void Main(string[] args)
    {
            int decValue = 2210;
            string bin = Convert.ToString(decValue, 2);
            string lowerbyte = bin.Substring(Math.Max(0, bin.Length - 16));

            if (lowerbyte.Length < 16)
            {
                lowerbyte = lowerbyte.PadLeft(16, '0');
            }


        Int16 circular = Convert.ToByte(CicrularLeftShift(lowerbyte, 3), 2);

            string xored = Convert.ToString((circular ^ 38556), 2).Substring(Math.Max(0, Convert.ToString((circular ^ 38556), 2).Length - 16));

            //converting final binary shift value to HEX
            string finalHex = Convert.ToString(Convert.ToInt32(xored, 2), 16).ToUpper();

        Console.WriteLine(finalHex);

    }

    private static string CicrularLeftShift(string key, int shift)
    {
        return key.Substring(shift, key.Length - shift) + key.Substring(0, shift);
    }
}

1
当输入超出无符号字节范围时,你想要发生什么?此外,你将Convert.ToByte的结果赋值给了一个Int16,这有点奇怪 - 你是想转换为short吗? - Lee
不清楚您想要得到什么,但我怀疑您不需要将数字转换为字符串,再转换回数字,再转换回字符串来完成它。您期望得到什么结果? - Gian Paolo
你想要转换的值是什么? - David
1
当它中断时的值为“0100010100010000”(这是从“CircularLeftShift”返回的返回值)-那么:你想用它做什么?您正在尝试将15位(从第一个非零位)转换为字节(8位)。您是否意味着“Convert.ToInt16”? - Marc Gravell
2
作为一个侧面的注释:通过字符串操作进行二进制操作让我感到非常不安... - Marc Gravell
显示剩余2条评论
1个回答

5

您正在尝试使用 Convert.ToByte 方法。

一个Byte是8位。您在字符串中提供了一个16位的数字。

如果您想要一个单独的Byte,请将您所有引用到16的地方修改为8。或者,如果您确实需要Int16,则使用 Convert.ToInt16 方法。

https://msdn.microsoft.com/zh-cn/library/4wxkt09k(v=vs.110).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接