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

贾尔迪尼

嗨,我正在尝试转换包含特殊字符(如û和)的字符串

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

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,我不希望这样成为问题,但我不确定。

编辑

0xB4006F00B8007300E700500051005D002800C2004600120026206100                  ´o¸sçPQ](ÂF…a           CORRECT
0xB4006F00B8007300E700500051005D002800C200460012002026006100                ´o¸sçPQ](ÂF.a       MY OUTPUT

0xB4006F00B8007300E700500051005D003D00CB0042000C00A50061006000AD004500BB00  ´o¸sçPQ]=ËB¥a`­E»         CORRECT
0xB4006F00B8007300E700500051005D003D00CB0042000C00A50061006000AD004500BB00  ´o¸sçPQ]=ËB¥a`­E»         MY OUTPUT

0xB4006F00B8007300E700500051005D002F00D30042001900B7006E006100              ´o¸sçPQ]/ÓB·na          CORRECT
0xB4006F00B8007300E700500051005D002F00D30042001900B7006E006100              ´o¸sçPQ]/ÓB·na      MY OUTPUT

0xB4006F00B8007300E700500051005F001A20BC006B0021003500DD00                  ´o¸sçPQ_‚¼k!5Ý          CORRECT
0xB4006F00B8007300E700500051005F00201A00BC006B0021003500DD00                ´o¸sçPQ_'¼k!5Ý          MY OUTPUT

0xB4006F00B8007300E700500051005D002F00EE006B00290014204E004100              ´o¸sçPQ]/îk)—NA         CORRECT
0xB4006F00B8007300E700500051005D002F00EE006B0029002014004E004100            ´o¸sçPQ]/îk)-NA         MY OUTPUT

0xB4006F00B8007300E700500051005D003800E600690036001C204C004F00              ´o¸sçPQ]8æi6“LO         CORRECT
0xB4006F00B8007300E700500051005D003800E60069003600201C004C004F00            ´o¸sçPQ]8æi6"LO         MY OUTPUT

0xB4006F00B8007300E700500051005D002F00F3006200390014204E004700C602          ´o¸sçPQ]/ób9—NGˆ        CORRECT
0xB4006F00B8007300E700500051005D002F00F300620039002014004E0047002C600       ´o¸sçPQ]/ób9-NG^        MY OUTPUT

0xB4006F00B8007300E700500051005D003B00EE007200330078014100                  ´o¸sçPQ];îr3ŸA          CORRECT
0xB4006F00B8007300E700500051005D003B00EE0072003300178004100                 ´o¸sçPQ];îr3YA          MY OUTPUT

0xB4006F00B8007300E700500051005D003000F20064003E009D004B00                  ´o¸sçPQ]0òd>K           CORRECT
0xB4006F00B8007300E700500051005D003000F20064003E009D004B00                  ´o¸sçPQ]0òd>?K          MY OUTPUT

0xB4006F00B8007300E700500051005D002F00E60075003E00                          ´o¸sçPQ]/æu>            CORRECT
0xB4006F00B8007300E700500051005D002F00E60075003E00                          ´o¸sçPQ]/æu>            MY OUTPUT

0xB4006F00B8007300E700500051005D002F00EE006A003000DC024500                  ´o¸sçPQ]/îj0˜E          CORRECT
0xB4006F00B8007300E700500051005D002F00EE006A0030002DC004500                 ´o¸sçPQ]/îj0~E          MY OUTPUT

谢谢您的每一个回复或评论,

问候。

隆隆

这是由于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("-", "");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将十六进制转换为C中的字符串?

在Windows Phone Runtime C#中将字符串十六进制转换为颜色

二进制字符串转换为十六进制c ++

C ++将带有“:”的十六进制字符串转换为原始的“二进制”字符串

在C ++中将十六进制字符串转换为无符号字符

C#将十进制转换为具有指定格式的字符串

C正在将字符串转换为十六进制

C#将十六进制字符串转换为十进制。为什么是负值?

使用C将十六进制字符串常量转换为十进制值

是否有函数或公式将字符串“字母”转换为C ++中的十六进制

(仅C)将特殊字符从字符串char转换为十六进制

在C#中将十六进制字符串转换为Number?

C#转换为Python中的十六进制字符串表示法

将BGRA 8位十六进制字符串转换为C#颜色

Java将十六进制字符串转换为Java:char [](C)转换为byte [](JAVA)

将十六进制值转换为C中字符串类型的ip地址。

在C#中将十六进制字符串转换为普通字符串

iOS Obj-C挂钩将十六进制转换为字符串

c#将字符串十六进制转换为ascii吗?从csv文件读取字符串

将C中的十六进制字符串转换为十进制

如何在 C# 中将十六进制字符串值转换为 byte[]

将十六进制字符串转换为二进制并分离为位 n C++

在 C# 中将十六进制字符串转换为字节数组

将字符指针十六进制转换为字符串并保存在文本文件中 C++

如何在 C++ 中将十六进制转换为十进制字符串?

将 C 中的字符串文本文件转换为十六进制编码

使用 0x (C#) 将十六进制字符串转换为 int32

C++ 如何将字符串字符转换为精确的十六进制字节

如何将字符串转换为十六进制并将该十六进制值存储到C++中的字符串中