我们在项目中有这么简单的代码:
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.选择一个字符并将其转换为一个字节。然而,错误发生了。
任何想法,提示?或者有人甚至可以提供一个抛出这种错误的字符串?
答案 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位,这就是您收到错误的原因。