我有一串符号“↕?0♠♠hIRW} ?? caq?☺??♦?♫x”我想把它转换为十六进制字符串。例如,在转换“☺”之后,变量hex将变为“01”并且“”将变为“00”。转换表可在此处找到http://www.jimprice.com/ascii-dos.gif
但我不知道如何用c#编码,有人可以帮忙吗?
string test = "☺";
Console.WriteLine("{0}", test);
byte[] b = Encoding.Default.GetBytes(test);
var hex = BitConverter.ToString(b);
Console.WriteLine("{0}", hex);
这是我现在的代码,但“☺”被视为“?”并打印“3F”。对不起,我不知道它是什么转换,并提前感谢。
答案 0 :(得分:0)
你有一个字节序列,以某种方式结束在一个字符串中。这不是存储字节的正确方法。字节是8位值,而构成.NET字符串的字符是16位值。在示例代码中,字符☺
由字符串中的16位值0x263A
表示,而不是您期望的0x01
或0x0001
。
要在字节序列和字符串之间进行转换,您需要进行编码。在您的情况下,您希望将字节解释为ASCII字符,这使得您的问题可以通过某种迂回方式解决。
要将每个字符转换为字节,您只需将字符转换为字节即可。当字符由0x0001
表示时,它将按预期转换为字节0x01
。但是,当字符为0x263A
(☺
)时,它将转换为0x3A
,表示使用ASCII编码的:
,因此这仅适用于ASCII字符。
全部放在一起(test
是存储ASCII字节的字符串):
var bytes = test.Select(ch => (byte) ch);
var bytesAsHexStrings = bytes.Select(b => b.ToString("X2"));
但是,首先删除字符串并简单地访问用于创建字符串的字节是解决问题的正确方法。
答案 1 :(得分:-1)
文本可能是Unicode。我认为Encoding.Default是ANSI代码页。
https://msdn.microsoft.com/en-us/library/system.text.encoding.unicode(v=vs.110).aspx
使用Encoding.Unicode(或其他编码之一)可能会修复它。