遇到以下代码问题,我收到此错误...
对于角色来说,值太大或太小......在线
sb.Append(Convert.ToChar(Convert.ToUInt32(hs,16)));
for (int i = 0; i < hexString.Length - 1; i += 2)
{
String hs = hexString.Substring(i, i + 2);
sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}
对C#有新的建议吗?
谢谢:)
答案 0 :(得分:0)
当转换为UInt32位基16(十六进制)时,看起来像你的十六进制子串,你正在使用的字符集太大(越界)。
检查您转换为Uint32和确保确实可以将其转换为char,这意味着它有效。
答案 1 :(得分:0)
正如@Lasse指出的那样,Substring
采用了起始索引和长度,但看起来你正试图传递一个起始索引和一个停止索引,因为您将i + 2
传递给每个电话。这意味着第一次迭代将创建一个双字符子串,第二次将是一个三字符子串,依此类推。只需将2
传递给它:
String hs = hexString.Substring(i, 2);
那应该纠正实际问题。
虽然这没有破坏任何东西,但你应该知道你正在做的是而不是转换为ASCII。 ASCII是特定的字符编码,Convert.ToChar
将数字转换为其对应的 Unicode (特别是UTF-16)字符。只要您的值的范围仅从0
到127
(00
到7F
十六进制),那么您可以将其用于所有实际目的,因为Unicode格式共享带有标准ASCII字符集的字符。但是,如果你的角色使用其中一个扩展名为ASCII(例如,拉丁语-1,这在Windows上很常见),那么这些字符将不匹配。
如果您的数据是ASCII格式且需要支持大于127的值,则可以将十六进制字符串转换为byte[]
,然后将其传递给ASCIIEncoding
类以使用ASCII格式:
byte[] data = new byte[hexString.Length / 2];
for(int i = 0; i < hexString.Length - 1; i += 2)
{
data[i / 2] = byte.Parse(hexString.Substring(i, 2));
}
string output = System.Text.Encoding.ASCII.GetString(data);
答案 2 :(得分:0)
string assumedASCII = string.Format(@"\x{0:x4}", (int)hexString);