これは、「possible」の値に対して実行できます。
String s = "" + (char)myShort;
ただし、すべての 16 ビット整数が有効な (UTF-16 エンコードされた) コードポイントを表すわけではないため、結果の文字列は無効になる場合があります。つまり、結果の文字列は無効なUTF-16 シーケンスである可能性があります。さまざまな文字列関数および/またはエンコード/デコードは、基本的なルールに違反しているため、「奇妙な動作」を引き起こす可能性があります (何が起こるかについては多少緩いと思いますが...)。あなたは警告されています -- 可能性のある現象を 1 つだけ示している一番下の例を参照してください。
tl、博士。この種のネットワーク送信には文字列を使用しないでください*。代わりに、バイト配列(または ByteBuffers) を使用し、short を高低の 2 つのオクテットとして送信します。(ああ、ByteBuffersについて言及しましたか? メソッドを見てください...) 文字列を送信する必要がある場合は、文字列をエンコード (UTF-8) し、データ パケットで「バイト」として送信することもできます。
もちろん、標準のシリアライゼーションまたはプロトコル バッファを使用してパケットを処理する方が簡単である可能性が非常に高く、カスタム エンコーディングより確実に優れています。(また、プロトコルバッファは、ジグザグ整数エンコーディングのようないくつかの巧妙なトリックを行います...)
ハッピーコーディング:)
*ただし、Quake 3 は多くのネットワーク メッセージに文字列を使用します...ただし、値を「プレーン テキストとして」エンコードし、たとえば「xyz=1234」と、一連のモンキー ハンド シリアル化コードを使用しました。
この「文字列の詰め込み」が悪いものになる理由については、出力の最後の値を参照してください;-)
public class test1 {
public static void main (String[] args) throws Exception {
int s1 = 0xd801;
short s = (short)s1;
String x = "" + (char)s;
System.out.println("orig int: " + s1);
System.out.println("orig short: " + s);
System.out.println("length of string: " + x.length());
System.out.println("value in string: " + (short)x.codePointAt(0));
int s2 = ((short)x.codePointAt(0)) & 0xffff;
System.out.println("restored value: " + s2);
byte[] xb = x.getBytes("UTF8");
System.out.println("encoded size: " + xb.length);
String x2 = new String(xb, "UTF8");
System.out.println("decode:" + x2);
System.out.println("decode length:" + x2.length());
int s3 = ((short)x2.codePointAt(0)) & 0xffff;
System.out.println("value in string:" + s3);
}
}
JDK 7、Windows 64 での結果。
orig int: 55297
orig short: -10239
length of string: 1
value in string: -10239
restored value: 55297
encoded size: 1
decode:?
decode length:1
value in string:63 WHAT IS THIS?!?!?! NOOOOO!!!!!