0

我有一个我认为很容易的问题。出于某种原因,以下代码会生成异常“字符串必须恰好是一个字符长”。

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并对自己说,没有想到使用 hexes 是个好主意。不敢相信我是这么想的。

4

4 回答 4

3

Convert.ToChar( string s )根据文档需要一个字符串,否则它会抛出FormatException你已经注意到的 a 。这是一个粗略的,虽然更严格,相当于

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

您的代码执行以下操作:

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

你到底想在这里完成什么。例如,给定charMsg由 3 个字符组成的 a,“a”、“b”和“c”,应该发生什么。清晰的问题陈述有助于我们为您提供帮助。

于 2013-04-24T21:55:19.650 回答
3

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

您能详细说明您要归档的内容吗?

于 2013-04-24T21:42:35.623 回答
1

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

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

于 2013-04-24T21:52:21.323 回答
-1

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

于 2013-11-15T11:20:56.467 回答