将具有特殊字符的字符串转换为十六进制-C#

时间:2019-08-12 10:36:37

标签: c# string character-encoding hex special-characters

嗨,我正在尝试转换包含特殊字符(例如// set schema when instantiating manager const manager = connection.createEntityManager({ schema: tenantDomain }); // should find all matching "order" entities within schema const orders = manager.find(Order, { priority: 4 }) // should find a matching "item" entity within schema using same manager const item = manager.findOne(Item, { id: 321 }) û)的字符串。

在研究和测试中,我几乎成功使用了以下功能:

如果我尝试对public static string ToHex(this string input) { char[] values = input.ToCharArray(); string hex = "0x"; string add = ""; foreach (char c in values) { int value = Convert.ToInt32(c); add = String.Format("{0:X}", value).Length == 1 ? "0" + String.Format("{0:X}", value) + "00" : String.Format("{0:X}", value) + "00"; hex += add; } return hex; } 进行解码,它将正确执行并将其转换为´o¸sçPQ^ûË\u000f±d

相反,当我尝试解码0xB4006F00B8007300E700500051005E00FB00CB000F00B1006400时,它会失败并变成´o¸sçPQ](ÂF\u0012…a而不是它  0xB4006F00B8007300E700500051005D002800C200460012002026006100

进行最少的调试,我看到字符串从 0xB4006F00B8007300E700500051005D002800C2004600120026206100´o¸sçPQ](ÂF\u0012…a,我不希望这成为问题,但我不确定。

编辑

´o¸sçPQ](ÂF.a

在此先感谢您的答复或评论,

问候。

1 个答案:

答案 0 :(得分:2)

这是由于endianness以及不同的整数和字符串编码所致。

char cc = '…';
Console.WriteLine(cc);
// 2026  <-- note, hex value differs from byte representation shown below
Console.WriteLine(((int)cc).ToString("x"));
// 26200000
Console.WriteLine(BytesToHex(BitConverter.GetBytes((int)cc)));
// 2620
Console.WriteLine(BytesToHex(Encoding.GetEncoding("utf-16").GetBytes(new[] { cc })));

您不应将char视为整数。有很多不同的方式来编码字符串,.net内部使用UTF-16。并且所有编码都使用字节,而不是整数。将字符显式转换为整数会导致意外的结果,就像您一样。为什么没有获得所需的编码并通过Encoding.GetBytes处理字节?

void Main()
{
    // output you expect 0xB4006F00B8007300E700500051005D002800C2004600120026206100
    Console.WriteLine(BytesToHex(Encoding.GetEncoding("utf-16").GetBytes("´o¸sçPQ](ÂF\u0012…a")));
}

public static string BytesToHex(byte[] bytes)
{
    // whatever way to convert bytes to hex
    return "0x" + BitConverter.ToString(bytes).Replace("-", "");
}