字符串必须正好是一个字符长

本文关键字:一个 字符 正好是 字符串 | 更新日期: 2023-09-27 18:10:50

我有一个我认为很容易的问题。由于某种原因,下面的代码生成了异常,"String必须恰好是一个字符长"。

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++;
}

异常发生在charMsg[n] = Convert.ToChar(hexOutput);行。为什么会这样呢?当我检查CharMsg的值时,它似乎包含了所有正确的值,但仍然向我抛出一个错误。

更新:我已经解决了这个问题,这是我的错误。对不起,打扰你了。

好吧,这对我来说是一个非常愚蠢的错误。关键是,我的问题,我甚至不应该这样做,因为十六进制值显然不会以任何方式帮助我。

我要做的是加密图像中的消息。我已经在第一个像素的每个颜色通道上以最后数字加密了该消息的长度。现在我试着把信息写进去。我看着这里:http://en.wikipedia.org/wiki/ASCII,对自己说,没有想到使用六边形将是一个好主意。真不敢相信我居然这么想。

字符串必须正好是一个字符长

Convert.ToChar( string s ),每个文档需要一个字符串,否则它会抛出一个FormatException,正如你所注意到的。它是

的粗略等价,但限制更严格。

公共字符string2char(字符串s){返回s[0];}

你的代码做了以下的事情:

  • 遍历某些可枚举字符集合中的所有字符。
  • 对于每个字符,它…
    • 将字符转换为整型。提示: a char是一个整型:它是一个无符号16位整数值。
    • 将该值转换为包含所讨论的字符十六进制表示的字符串。对于大多数字符,该字符串的长度将至少为两个字符:例如,以这种方式转换空格字符(' ',0x20)将得到字符串"20"。
    • 然后尝试将其转换回char并替换正在迭代的当前项。这就是抛出异常的地方。这里需要注意的一点是,修改枚举的集合可能会导致枚举器抛出异常。

你到底想要完成什么?例如,给定由'a', 'b'和'c'三个字符组成的charMsg,应该发生什么?一个清晰的问题陈述可以帮助我们帮助你。

由于可打印的unicode字符可以在0x00000xFFFF范围内的任何位置,因此您的hexOutput变量可以保存多个字符-这就是抛出错误的原因。Convert.ToChar(string)将始终检查字符串的长度a,如果它不等于1 -它将抛出。因此,它不会将字符串0x30转换为十六进制数,然后转换为ascii表示,符号0

你能详细说明你要存档的是什么吗?

您的hexOutput是一个字符串,我假设charMsg是一个字符数组。假设charMsg中的第一个元素是'p',或十六进制值70。Convert.ToChar(string)的文档说它将只使用字符串的第一个字符('7'),但这是错误的。它会抛出这个错误。您可以使用静态示例(如charMsg[n] = Convert.ToChar("70");)进行测试。你会得到相同的错误。

您正在尝试用十六进制值替换字符吗?如果是这样,您可以尝试使用StringBuilder对象而不是数组赋值。

Convert.ToChar(string)如果是空字符串导致此错误。使用cchar()