从十六进制字符串从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
Это тестовое сообщение юникода

Demo here

,

看起来会相反:

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()));

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...