C# big-endian UCS-2

本文关键字:UCS-2 big-endian | 更新日期: 2023-09-27 18:04:48

我目前正在进行的项目需要与我们不制作的客户端系统接口,因此我们无法控制数据的发送方式。问题是,我们在C#中工作,它似乎不支持UCS-2,也很少支持big-endian。(据我所知(

我想知道的是,是否有我在.net上看过的东西,或者其他人制作并发布的东西,我们可以使用。如果没有,如果可能的话,我会尝试用自定义方法对其进行编码/解码。

但不管怎样,谢谢你抽出时间。

编辑:BigEndianUnicode是否能正确解码字符串,问题是接收其他数据时使用了big-endian,到目前为止使用了IPAddress。HostToNetworkOrder((正如其他地方建议的那样,允许我解码一半的字符串(Merli?是出现的,应该是Merlin33069(

我正在梳理短代码,看看是否还有另一个长度变量我错过了

分辨率:在弄清楚bigendian变量是主要问题后,我回过头来查看了细节,字符串的长度似乎是以字符计数发送的,而不是以字节计数发送的(在utf中,一个字符似乎是两个字节(。我所需要做的就是将其加倍,结果就成功了。谢谢大家的帮助。

C# big-endian UCS-2

string x = "abc";
byte[] data = Encoding.BigEndianUnicode.GetBytes(x);

其他方向:

string decodedX = Encoding.BigEndianUnicode.GetString(data);

它并不完全是UCS-2,但对大多数情况来说已经足够了。

UPD:Unicode常见问题

Q: UCS-2和UTF-16之间有什么区别?

A: UCS-2是指Unicode的过时术语在代理代码点和UTF-16被添加到该标准的2.0版本中。这个学期现在应该避免。

UCS-2没有定义不同的数据格式,因为UTF-16和UCS-2出于数据交换的目的是相同的。两者都是16位,并且完全相同的代码单元表示。

在过去,有时一个实现被标记为"UCS-2"指示它不支持补充字符并且不支持将代理代码点对解释为字符。这样一个实现将不处理字符属性的处理,补充字符的代码点边界、排序规则等。

EDIT:现在我们知道问题不在于文本数据的编码,而在于length。有几个选项:

  • 反转字节,然后使用内置的BitConverter代码(我认为这就是您现在使用的代码;that或BinaryReader(
  • 使用重复的"添加和移位"操作自己执行转换
  • 使用MiscUtil中的EndianBitConverterEndianBinaryReader类,它们类似于BitConverterBinaryReader,但允许您指定endianness

您可能正在查找Encoding.BigEndianUnicode。这就是big-endian UTF-16编码,严格来说与UCS-2不同(正如Marc所指出的(,但除非你给它提供包括BMP之外的字符(即在U+FFFF之上(的字符串,否则它应该是好的,这些字符不能在UCS-2中表示,但在UTF-16中表示

来自维基百科页面:

旧的UCS-2(2字节通用字符集(是一种类似的字符编码,在1996年7月的Unicode标准2.0版中被UTF-16取代,包括当时已经被分配了值的所有字符。

我发现客户端系统不太可能在有差异的地方向您发送字符(基本上是代理对,无论如何都是永久保留的(。

UCS-2与UTF-16非常接近,Encoding.BigEndianUnicode几乎总是就足够了。

通过移位操作可以更正确地解决读取长度前缀(如big-endian(的问题(注释(,这将在所有系统上做正确的事情。例如:

Read4BytesIntoBuffer(buffer);
int len =(buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | (buffer[3]); 

然后,这将在任何系统上以相同的方式工作(在解析大端序4字节int时(,而不考虑本地端序。