(byte)Convert.ToChar(anyStringOfLengthOne)怎么可能抛出错误?

时间:2011-12-01 11:51:14

标签: c# .net string char byte

我们在项目中有这么简单的代码:

string input = "Any string";
for (int i = 0; i < input.Length; i++)
{
    string stringOfLengthOne = input.Substring(i, 1);
    byte value = (byte)Convert.ToChar(stringOfLengthOne);
    if (value == someValue)
    {
        // do something
    }
}

输入是一个字符串,其字符通常从需要根据字节值处理的文件中读取。

不幸的是,我们没有机会逐步调试这个过程,我们只需要做出有根据的猜测,猜测哪种字符串可能会导致

 (byte)Convert.ToChar(anyStringOfLengthOne)

在上面的代码中抛出“算术运算导致溢出”错误。

我的想法是,只要我有一个字符串,就应该总是可以1.选择一个字符并将其转换为一个字节。然而,错误发生了。

任何想法,提示?或者有人甚至可以提供一个抛出这种错误的字符串?

3 个答案:

答案 0 :(得分:2)

.Net中的字符长度为16位(短/ ushort)。

C#的默认项目设置意味着强制转换可以工作,并且只会忽略任何大于255的字符的高位,即使用(byte) (c & 0xff)

但是,如果使用检查算术,尝试强制转换大于255的char将导致ArithmeticOverflowExcetion。

可以在项目的构建设置中将算术的默认设置设置为选中/取消选中。

实施例

char c = (char) 300;
byte b = unchecked ((byte) c);
Console.WriteLine (b);

// Result: 44

char c = (char) 300;
byte b = checked ((byte) c);
Console.WriteLine (b);

// Result: ArithmeticOverflowExcetion

替代

另外,您可以直接比较字符。

例如,测试一个字符是否为0-9

char c = input[i];
if (c >= '0' && c <= '9') {
    // do something
}

您甚至可以将char与int进行比较

char c = input[i];
if (c >= 48 && c <= 57) {
    // do something
}

答案 1 :(得分:1)

为什么不访问input [i]而不是使用Substring和Convert?

编辑:

哦,对不起,我错过了。 .NET(Unicode)中的字符为16位,因此如果您使用非英语字符,则无法将字符转换为字节非常合理。例如,尝试任何希伯来语字母。

答案 2 :(得分:1)

来自docs

  

字符串中的每个字符也由Unicode标量值定义   称为Unicode代码点或序号(数字)值   Unicode字符。每个代码点都使用 UTF-16 进行编码   编码,以及编码的每个元素的数值   由Char对象表示。

字节为8位,UTF-16为16位,这就是您收到错误的原因。