如何解决从十六进制字符串从UCS-2转换为UTF-8
我正在使用第三方SMS提供商,并且遇到了将UCS-2消息转换回可读文本的问题。
他们的API文档包含此代码示例,该示例将UCS-2消息转换为我在API上获取的消息。
string message = "Это тестовое сообщение юникода";
byte[] ba = Encoding.BigEndianUnicode.GetBytes (message);
var hexString = BitConverter.ToString (ba);
Console.WriteLine ("@U" + hexString.Replace("-",""));
将message
字符串转换为
@U042D0442043E00200442043504410442043E0432043E043500200441043E043E043104490435043D043804350020044E043D0438043A043E04340430
这似乎是我从其API中提取的UCS-2消息。 不幸的是,他们没有提供有关如何将消息转换回可读形式的任何代码示例。
我确定它在文档中不存在,因为它很简单-但我似乎只是想出方法。
解决方法
反转您的内容(以@U
开头的十六进制字符串)
var message = "Это тестовое сообщение юникода";
var ba = Encoding.BigEndianUnicode.GetBytes(message);
var hexString = BitConverter.ToString(ba);
var encoded = "@U" + hexString.Replace("-","");
Console.WriteLine(encoded);
// reverse
var bytes = Enumerable.Range(2,encoded.Length-2)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(encoded.Substring(x,2),16))
.ToArray();
var result = Encoding.BigEndianUnicode.GetString(bytes);
Console.WriteLine(result);
输出
@U042D0442043E00200442043504410442043E0432043E043500200441043E043E043104490435043D043804350020044E043D0438043A043E04340430
Это тестовое сообщение юникода
,
看起来会相反:
string message = Encoding.BigEndianUnicode.GetString(ba);
可以通过以下方法提取字节:
private IEnumerable<byte> GetTheBytes(string uc2Message)
{
string bytesOnly = uc2Message.Trim('@','U');
for (int i = 0; i < bytesOnly.Length-2; i+=2)
{
yield return Convert.ToByte($"{bytesOnly[i]}{bytesOnly[i+1]}",16);
}
}
Console.WriteLine(Encoding.BigEndianUnicode.GetString(GetTheBytes(uc2Message).ToArray()));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。