2011-08-07 7 views
2

私が現在取り組んでいるプロジェクトは、私たちが作っていないクライアントシステムとインターフェースする必要があるので、どちらの方法でデータが送られるかを制御することはできません。問題は、C#で作業していたことです。これはUCS-2をサポートしていないようで、ビッグエンディアンはほとんどサポートされていません。 (私が知る限り)C#ビッグエンディアンUCS-2

私が知りたいのは、ネットで見ているものがあるか、他人が作って使っているものがあるかどうかです。もしそうでなければ、私はカスタムメソッドでそれをエンコード/デコードする際に亀裂をとるでしょう。

いずれにせよお時間をいただきありがとうございます。

EDIT: BigEndianUnicode が正しく文字列をデコードする作業を行い、問題がこれまでに(IPAddress.HostToNetworkOrderを使用して、ビッグエンディアンとして他のデータを受信して​​いた)他の場所で示唆したように(私は文字列の半分をデコードすることができました私は、ビッグエンディアンの変数が主な問題だったことをワークアウト後 :?メルリは、最大来るものであり、それは

Imは別の長さ変数iが

解決を逃したtheresのかどうかを確認するために、短いコードをコーミング)Merlin33069する必要があります詳細を見直してみたところ、文字列のengthはバイトカウントではなく文字カウントで送られました(私はcharが2バイトであると思われます)。私がする必要があったのはそれを倍にしてしまったからです。助けてくれてありがとう。

+2

ほとんどの(すべてではない)ケースでは、UCS-2はUTF-16と同じです。あなたは 'Encoding.BigEndianUnicode'を探していますか?これは本当に.NETではないことに注意してください。C# –

+0

私はこの問題がUCS-2とUTF-16の違いではないことを強く疑っています。問題を実証しているいくつかのサンプルデータを与えてください - 生のバイト数とデコードされたテキストが期待されるものを表示してください。 –

+0

まあ、私は問題が見つかりました、クライアントはJavaで、私たちの側はC#で、文字列*長さを送信するときにもbigendianで、そのときに私たちはCの長さを取得する異なる。 – RyanTimmons91

答えて

2

EDIT:今、私たちは問題がテキストデータのエンコーディングにが、のエンコーディングではないことを知っています。いくつかのオプションがあります:

    は、バイトを逆して、内蔵された(私はあなたが今使っているものであると仮定し、そのまたは BinaryReaderBitConverterコードを使用
  • 「自分が繰り返し使用して変換を実行し
  • を追加とシフト "操作
  • 私のEndianBitConverterまたはEndianBinaryReaderのクラスはMiscUtilからBitConverterBinaryReaderのようになりますが、エンディアンを指定できるようにしてください。

あなたはEncoding.BigEndianUnicodeを探していてもよいです。これはビッグエンディアンのUTF-16エンコーディングです。厳密にはUCS-2(Marcが指摘する)と同じではありませんが、BMP以外の文字を含む文字列(U + FFFF以上) UCS-2では表現できませんが、はUTF-16で表されたです。 Wikipedia pageから

古いUCS-2を(2バイトのユニバーサル文字セット)は1996年7月にUnicode標準のバージョン2.0にUTF-16に取って代わられた類似の文字エンコーディングです。 2単純に16ビットコード単位としてコードポイントを使用して固定長形式を生成し、0〜0xFFFFの範囲内のすべてのコードポイントの96.9%に対してUTF-16とまったく同じ結果を生成します。その時点で値が割り当てられていました。

私はそれが非常に低いクライアントシステムがあなたに(基本的には永久にとにかくその使用のために予約されているサロゲートペア、である)差異があります文字を送信していることがわかります。他の方向では

+0

または代理範囲内。 –

+0

@Ignacio:編集前または編集後にあなたのコメントを投稿したかどうかはわかりません。もう一度チェックして、追加するものがあるかどうか確認できますか? –

+0

私の知る限り、すべてのテキストは通常​​の文字でなければなりません。 – RyanTimmons91

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

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

まさにUCS-2ではありませんが、それはほとんどの場合のために十分です。

UPD:Unicode FAQ

Q:UCS-2とUTF-16との違いは何ですか?

A:UCS-2は、サロゲートコードポイントと UTF-16が標準のバージョン2.0に追加される前に、ユニコード1.1までのUnicode 実装を参照する旧式の用語です。この用語は現在 になるはずです。

UTF-16とUCS-2 はデータ交換の目的で同一であるため、UCS-2では個別のデータ形式は定義されていません。両方とも16ビットであり、 はまったく同じコードユニット表現を持っています。

時には、実装が補助文字をサポートしていないことを示す に「UCS-2」というラベルが付けられており、 が文字としての複数のサロゲートコードポイントを解釈しないことがあります。このような の実装では、文字プロパティ、 コードポイントの境界、照合などの処理が補足文字として処理されません。

+0

UCS-2/UTF-16 ... UTF-16ユニコードエクステンションAとBの違いをよりよく説明してください。UCS-2はBasic Multilingual Plane(BMP)のみをサポートしています。 –

+0

@ J-16:答えを更新しました。 –

1

UCS-2 Encoding.BigEndianUnicodeますほとんど常にで十分というUTF-16に近いです。

長さの接頭辞(ビッグエンディアン)を読むことに関する問題(コメント)は、すべてのシステムで正しいことを行うシフト操作によって、より正確に解決されます。たとえば:

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

そして、これは関係なく、地元のエンディアンの、上(ビッグエンディアン4バイトのint型を解析する時に)どのシステムを同じように動作します。

関連する問題