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

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

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[n] = Convert.ToChar(hexOutput); 线。 为什么会这样? 当我检查CharMsg的值时,它似乎正确地包含了所有这些值,但仍然向我抛出错误。

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

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

我试图用它来加密图像中的消息。 我已经在第一个像素的每个颜色通道上的最后几位加密了所述消息的长度。 现在我想把信息放在那里。 我在这里看到: http : //en.wikipedia.org/wiki/ASCII并且在没有想到usung hexes会是一个好主意的情况下对自己说。 不能相信我以为。

Convert.ToChar( string s ) , 根据文档需要单个字符串,否则它会抛出FormatException如您所述。 这是一个粗略的,但更具限制性,相当于

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

您的代码执行以下操作:

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

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

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

你能详细说明你想要达到的目的吗?

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

您是否尝试使用hex值替换字符? 如果是这样,您可以尝试使用StringBuilder对象而不是arrays分配。

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