Ўвод кароткі ў 2 байта радкі

Так што я раблю свой уласны сеткавы пратакол для онлайн-гульні, каб захаваць прастору кожнага паведамленні (адпраўленыя праз TCP) прысвойваецца ідэнтыфікатар, які з'яўляецца кароткі, 2 байта, ўсе паведамленні, адпраўленыя з сервера да кліента і наадварот з'яўляюцца радкі як я магу пераўтварыць кароткае замыканне на радок у Java усяго за 2 байта (сімвалы)?

Update: I'm probably not being clear as to what I want... I want to be able to convert a short int into 2 characters, so that I can send the short over the network in a string format in just 2 bytes and decode it back into a short on the other side (in actionscript 3).

Персанаж можа ўтрымліваць 256 магчымых значэнняў правільна? Такім чынам, 256 * 256 = 65536, які з'яўляецца памерам знака кароткага міжнар!

Вось што ў мяне да гэтага часу:

public static String toCode(int c){

    if(c <= 255 ){
        return Character.toString((char)c);
    }else{
        return null;
    }
}

public static int fromCode(String c){
    return ((int)c.charAt(0));//Return the character code of the send string, 1 char only
}

Гэта можа ператварыць Int у адзін знак, які можа быць перададзены па сетцы, цяпер мне проста трэба мець яго выкарыстоўваць 2 сімвала, і ён можа зрабіць да кароткі.

3
Вы паглядзіце на гэтае пытанне stackoverflow.com/questions/231051/… . Радок у Java ўсяго 2 байта проста немагчыма.
дададзена аўтар Narendra Yadala, крыніца
Вы не можаце - вось чаму ёсць кароткі у першую чаргу ...
дададзена аўтар Yahia, крыніца
Java, сімвал з'яўляецца 16-біт, а не 8 ...
дададзена аўтар John Flatness, крыніца
Калі вы спрабуеце зэканоміць месца, я не думаю, што вы павінны выкарыстоўваць радкі :)
дададзена аўтар user697111, крыніца

3 адказы

Гэта можна зрабіць пры некаторым значэнні «магчыма».

String s = "" + (char)myShort;

However, the resulting string may be invalid as not all 16-bit integers represent valid (UTF-16 encoded) code-points! That is, the resulting string may be an invalid UTF-16 sequence. Various string functions and/or encoding/decode may result in "strange behavior" as the fundamental rules have been violated (I think it is somewhat lax as to what may occur, but...). You have been warned -- see the bottom example showing just one possible manifestation.

Т.Л., інш. <Моцны> Не выкарыстоўваць радкі для такога роду перадачы па сетцы * . Хутчэй, выкарыстоўваць масівы байтаў (ці ByteBuffers) і адправіць кароткае як два актэта, высокіх і нізкіх. (О, і я згадваў ByteBuffers ? паглядзіце на метады ...) Калі радкі павінны быць адпраўлены яны могуць быць закадзіраваны (UTF-8), а таксама паслаў у «байт» у пакетах дадзеных.

Вядома, гэта цалкам верагодна, будзе прасцей выкарыстаць стандартнай серыялізацыі або буферы , каб мець справу з пакетамі ... вядома б'е прыстасаваныя кадоўкі. (Акрамя таго, пратакол буфера робяць некаторыя хітрыкі, як зігзагападобныя цэлалікавых кадаваньне ...)

Шчаслівае кадаваньне :)


* Нягледзячы на ​​тое, Quake 3 выкарыстоўвае радкі для шэрагу сеткавых паведамленняў ... аднак, закадаваныя значэння «у выглядзе простага тэксту» - напрыклад, «Хуг = 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!!!!!
5
дададзена
Я не магу выкарыстоўваць стандартныя серыялізацыі, так як кліент будзе ўспышка і сервер у Java, так што я павінен быў бы некаторыя карыстацкія серыялізацыі.
дададзена аўтар James T, крыніца
О, калі ласка, растлумачце -1.
дададзена аўтар user166390, крыніца
@ Bubby4j У любым выпадку, лячыць серыялізацыі і перадаюцца дадзеных у выглядзе паслядоўнасці octects, а не радок (прынамсі, з Java). Я не ўпэўнены, што падтрымка флэш мае для байтавая патокаў ці як ён апрацоўвае радок/дэкадаванне радка. Гэта можа быць карысна, каб проста выкарыстоўваць «тоўсты» тэкставы фармат паведамлення (нават, скажам, у фармаце JSON), які будзе «строп», калі не даказаны неабходнасці кадзіраваць яго ў нечым вельмі кампактным. Іншыя варыянты ўключаюць базавую-кадаваньне двайковых дадзеных (base64 з'яўляецца агульным, але звычай base96/128 па-ранейшаму быць UTF-8 дружалюбныя, ён не павінен быць «чытэльным» кадаваньне, проста «сапраўдны» адзін).
дададзена аўтар user166390, крыніца
@ Bubby4j «UTF-8» дружалюбныя радкі з'яўляюцца тыя, у якіх усе (ці амаль усе) сімвалы могуць быць закадзіраваны ў адзін актэт; усе звычайныя сімвалы ASCII кадуюцца ў выглядзе аднаго актэта.
дададзена аўтар user166390, крыніца

DataOutputStream.writeShort/DataInputStream.readShort?

1
дададзена
+1 Вельмі добрая кропка - значыць адносна простыя метады для серыялізацыі патокаў.
дададзена аўтар user166390, крыніца

Я не выкарыстоўваю Java, але я думаю, што вы проста хочаце выкарыстоўваць аператар прывядзення. Калі ваш кароткі называюцца MyNumber, выкарыстоўвайце (сімвалы) MyNumber. Гэта значыць, калі вы потым збіраецеся лячыць гэтыя біты як кароткія, калі яны выходзяць на іншы бок. Поспехаў з папярочным platformness, хоць, калі вы выкарыстоўваеце «кароткі», як вызначэнне сваёй вобласці, а не «16-разраднае міжнар», ёсць некаторыя эзатэрычныя платформы па-за там.

1
дададзена