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中,一个字符似乎是两个字节(。我所需要做的就是将其加倍,结果就成功了。谢谢大家的帮助。
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中的
EndianBitConverter
或EndianBinaryReader
类,它们类似于BitConverter
和BinaryReader
,但允许您指定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时(,而不考虑本地端序。