从十六进制字符串(从 UCS-2)转换为 UTF-8
Convert from hex string (from UCS-2) into 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 消息。
不幸的是,他们没有提供任何代码示例来说明如何将消息转换回可读形式。
我确定它不在文档中,因为它很简单 - 但我似乎想知道如何去做。
看起来情况正好相反:
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()));
反转你所拥有的(以@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
Это тестовое сообщение юникода
我正在使用第三方 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 消息。 不幸的是,他们没有提供任何代码示例来说明如何将消息转换回可读形式。
我确定它不在文档中,因为它很简单 - 但我似乎想知道如何去做。
看起来情况正好相反:
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()));
反转你所拥有的(以@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
Это тестовое сообщение юникода