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

时间:2013-04-24 21:39:55

标签: c#

我认为这是一个简单的问题。由于某种原因,以下代码生成异常,“字符串必须恰好是一个字符长”。

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并对自己说,没有想到usung hexes会是一个好主意。不能相信我以为。

4 个答案:

答案 0 :(得分:2)

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

你能详细说明你想要实现的目标吗?

答案 1 :(得分:2)

Convert.ToChar( string s )per the documentation需要一个字符串,否则会引发FormatException,如您所述。

是一个粗略的,但更具限制性的等价物

public char string2char(string s)   {     返回s [0];   }

您的代码执行以下操作:

  • 迭代一些可记忆的角色集合中的所有角色。
  • 对于每个这样的角色,它......
    • 将char转换为int。 提示: a char是一个整数类型:它是一个无符号的16位整数值。
    • 将该值转换为包含所讨论字符的十六进制表示的字符串。对于大多数字符,该字符串的长度至少为两个字符:例如,以这种方式转换空格字符('',0x20)将为您提供字符串“20”。
    • 然后尝试将其转换回char并替换正在迭代的当前项。这是抛出异常的地方。您应该注意的一件事是,更改枚举的集合可能会导致枚举器抛出异常。

你到底想要在这里完成什么?例如,给定一个由{3}字符组成的charMsg,'a','b'和'c',应该发生什么。明确的问题陈述有助于我们为您提供帮助。

答案 2 :(得分:1)

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

您是否尝试使用十六进制值替换字符?如果是这样,您可以尝试使用StringBuilder对象而不是阵列分配。

答案 3 :(得分:-1)

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