C# 字符串长度必须正好为一个字符
我有一个我认为很容易的问题。出于某种原因,下面的代码生成异常,“字符串必须正好有一个字符长” 异常发生在C# 字符串长度必须正好为一个字符,c#,C#,我有一个我认为很容易的问题。出于某种原因,下面的代码生成异常,“字符串必须正好有一个字符长” 异常发生在charMsg[n]=Convert.ToChar(hexOutput)处行。为什么会这样?当我检查CharMsg的值时,它似乎正确地包含了所有这些值,但仍然向我抛出一个错误 更新:我已经解决了这个问题,这是我的错误。对不起打扰你了 好吧,这对我来说真是个愚蠢的错误。问题是,对于我的问题,我甚至不应该这样做,因为十六进制值显然对我没有任何帮助 我要做的是加密图像中的消息。我已经在第一个像素的每
charMsg[n]=Convert.ToChar(hexOutput)处代码>行。为什么会这样?当我检查CharMsg
的值时,它似乎正确地包含了所有这些值,但仍然向我抛出一个错误
更新:我已经解决了这个问题,这是我的错误。对不起打扰你了
好吧,这对我来说真是个愚蠢的错误。问题是,对于我的问题,我甚至不应该这样做,因为十六进制值显然对我没有任何帮助
我要做的是加密图像中的消息。我已经在第一个像素的每个颜色通道的最后几位加密了上述消息的长度。现在我正试着把这个信息放进去。我看着这里,心不在焉地对自己说,使用十六进制是个好主意。难以置信我这么想。由于可打印的unicode字符可以在0x0000
到0xFFFF
范围内的任意位置,您的hexOutput变量可以包含多个字符-这就是引发错误的原因。
Convert.ToChar(string)
将始终检查字符串的长度,如果它不等于1,则将抛出。因此,它不会将字符串0x30
转换为十六进制数,然后再转换为ascii表示形式,即符号0
你能详细说明你想归档什么吗?你的hexOutput是一个字符串,我假设charMsg是一个字符数组。假设charMsg中的第一个元素是“p”,或十六进制值70。Convert.ToChar(string)的文档说它将只使用字符串的第一个字符('7'),但这是错误的。它会抛出这个错误。您可以用一个静态示例来测试这一点,比如charMsg[n]=Convert.ToChar(“70”)代码>。你会得到同样的错误
您正在尝试用十六进制值替换字符吗?如果是这样,您可以尝试使用StringBuilder对象而不是数组指定 Convert.ToChar(string s)
需要一个字符串,否则它会抛出一个FormatException
。这是一个粗糙的,虽然限制更多,相当于
公共字符string2char(字符串s)
{
返回s[0];
}
您的代码执行以下操作:
- 迭代某些可枚举字符集合中的所有字符
- 对于每一个这样的角色,它。。。
- 将字符转换为整数。提示:
char
是整数类型:是无符号16位整数值
- 将该值转换为包含相关字符十六进制表示形式的字符串。对于大多数字符,该字符串的长度至少为两个字符:例如,以这种方式转换空格字符(“”,0x20)将得到字符串“20”
- 然后尝试将其转换回字符,并替换正在迭代的当前项。这就是抛出异常的地方。这里需要注意的一点是,更改正在枚举的集合可能会导致枚举器引发异常
你到底想在这里完成什么。例如,给定一个由3个字符组成的charMsg
,“a”、“b”和“c”,应该发生什么。清晰的问题陈述有助于我们帮助您。Convert.ToChar(字符串)如果是空字符串,则会导致此错误。使用cchar()这与linq有什么关系?使用Convert.ToChar(hexOutput)代替Convert.ToChar(value)输入字符串是什么?显然hexOutput的长度不止一个字符。你想干什么?(添加到您的问题,而不是在另一条评论中)我的输入字符串来自一个文本框。嗨,谢谢您尝试帮助我。我已经更新了OP,正如你所看到的,我犯了一个非常愚蠢的错误,甚至考虑按我想要的方式使用hexes。对不起,麻烦了。
int n = 0;
foreach (char letter in charMsg)
{
// Get the integral value of the character.
int value = Convert.ToInt32(letter);
// Convert the decimal value to a hexadecimal value in string form.
string hexOutput = String.Format("{0:X}", value);
//Console.WriteLine("Hexadecimal value of {0} is {1}", letter, hexOutput);
charMsg[n] = Convert.ToChar(hexOutput);
n++;
}