Жолдың 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 = 65,536, бұл белгісіз қысқа ені!

Міне, менің алдымда:

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
}

Бұл интиті желі арқылы жіберуге болатын бір таңбаға айналдыра алады, енді оны тек 2 таңбаны қолданып, қысқаша жасауға болады.

3
Бұл сұрақты қарастырып көріңіз stackoverflow.com/questions/231051/… . Java-нің 2-байтында жол мүмкін емес.
қосылды автор Narendra Yadala, көзі
мүмкін емес - сондықтан бірінші кезекте short бар.
қосылды автор Yahia, көзі
Java char - бұл 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) және қысқа екі октет, жоғары және төмен ретінде жіберіңіз. (О, және мен Байтабельдер туралы айттым ба? Әдістерге қараңыз ...) Егер жолдарды жіберу керек болса, олар кодталуы мүмкін (UTF-8), сондай-ақ деректер бумаларында «байттар» ретінде жіберіледі.

Әрине, стандартты серияландыру немесе Пакеттермен жұмыс істеу үшін Протокол буферлері . (Сондай-ақ, протокол аралықтары zig-zag бүтін кодтау сияқты кейбір дұрыс амалдарды жасайды ...)

Бақытты кодтау :)


* Дегенмен, 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!!!!!
5
қосылды
Стандартты сериализацияны қолдана алмаймын, өйткені клиент java-дегі және серверде болады, сондықтан маған кейбір ретпен реттелетін сериализация қажет болады.
қосылды автор James T, көзі
О, түсіндіріп беріңізші - 1.
қосылды автор user166390, көзі
@ Bubby4j Қалай болғанда да, серияландыру және тасымалданатын деректерді сегменттің дәйектілігі ретінде қарастырыңыз (кем дегенде Java-дан). Флэштің байт ағындары үшін қандай тірекке ие екенін немесе жолдарды/жолды декодтауды қалай қолдайтынын білмеймін. Мүмкін, оны өте тығыз деп кодтау қажет болғанға дейін «жол қауіпсіз» болатын «майлы» мәтіндік хабарлар пішімін (тіпті, айталық, JSON) пайдалану пайдалы болуы мүмкін. Басқа опциялар екілік деректерді базалық кодтауды қамтиды (base64 әдеттегі, бірақ пайдаланушы базасы 96/128 бұрынғыдай UTF-8 достық болып табылады, ол «оқуға болатын» кодтау болуы керек, тек «жарамды»).
қосылды автор user166390, көзі
@ Bubby4j «UTF-8 достық» жолдары - барлық (немесе дерлік) таңбалардың бір октетке кодталатыны; барлық тұрақты ASCII таңбалары бір октет ретінде кодталады.
қосылды автор user166390, көзі

DataOutputStream.writeShort/DataInputStream.readShort?

1
қосылды
+1 Өте жақсы нүкте - сериализациялау ағындарының салыстырмалы қарапайым әдісі бар.
қосылды автор user166390, көзі

Мен java-ды пайдаланбаймын, бірақ сіз тек қана операторды қолданғыңыз келеді деп ойлаймын. Егер сіздің қысқа нөміріңіз қоңырау деп аталса, онда (char) нөмірін пайдаланыңыз. Яғни, егер сіз сол биталарды басқа тараптан шыққан кезде қысқа деп есептесеңіз. Сіз «16-бит қолтаңба int» дегеннің орнына өзіңіздің өрістің анықтамасы ретінде «қысқа» сөзін пайдаланып жатсаңыз да, кросс-платформаға сәттілік тілейміз, сонда кейбір эзотерикалық платформалар бар.

1
қосылды