0

最初の 2 バイトでメッセージの長さを送信する必要があります。

メッセージの長さを計算すると、752 であることがわかりました。つまり、16 進数で 02F0 とします。次に、この 16 進値に対応する特別な記号を計算する必要があります。私が使用するものを取得するため

 int num1 = Integer.parseInt("F0", 16);
 char c1 = (char) num1;

to get -> ð 最初の文字は (エンコーディングのために) そこには表示されませんが、正しい文字は取得できます。とにかく、これらの特殊文字を最終メッセージ文字列 (ASCII) に連結すると、02F0 から 023f に変更されます (最終メッセージをウルトラエディット 16 進ビューで読み取ることによって確認されました)。なぜそれが起こっているのですか?3F は 10 進数で 63 であり、次のコード スニペットでも同じことが起こっていることがわかります->

Charset asciicharset = Charset.forName("ASCII");
Charset iso88591charset = Charset.forName("ISO-8859-1");

byte [] a = new byte[]{(byte)0x02, (byte)0xF0};

ByteBuffer inputBuffer = ByteBuffer.wrap(a);

CharBuffer data = asciicharset .decode(inputBuffer);

ByteBuffer outputBuffer = asciicharset .encode(data); --> This is where instead of 240
for F0 I get 63, in fact I tried with any value more than 63 but it always comes back to
that

byte[] outputData = outputBuffer.array();

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

コメントした行ではなく、の行で問題が発生していると思われます。つまり、次のようになります。

 CharBuffer data = asciicharset .decode(inputBuffer);

ASCII文字は8ビットではなく7ビットです。したがって、127(16進数で0x7F)を超える値は、asciicharsetに含まれないため、decode()おそらくデフォルトの置換を使用しています。(63は文字「?」に対応することに注意してください。これはデフォルトの置換として意味があります。)

更新:上下のコメントスレッドから、あなたがやろうとしていることについてもう少し理解できたので、Charsetをまったく使用しないことをお勧めします(そこにある標準の名前付きエンコーディングはいずれも/すべてで機能しないため)長さに対して2バイトの組み合わせがある場合があります。たとえば、UTF-16でも値が予約されています)。代わりに、バイトバッファを使用し、これから最初の長さのバイトを削除したでのみ文字列に変換しようとすることをお勧めします。

于 2012-07-09T04:31:22.063 に答える