Thema: Aktueller Huffman-Tree
-
18.01.2025, 13:33 #1
- Registriert seit
- 28.10.2011
- Beiträge
- 630
Thanked 281 Times in 169 PostsAktueller Huffman-Tree
Hey ho!
Ich versuche aktuell den neusten Huffman-Tree zu verwenden, da er sich wohl minimal verändetr hat.
Egal in welcher Form das Tree verwendet wird, das parsen habe ich erstmal gelassen und mache es aktuell auf anderem Wege:
Ich lese den fertigen Tree direkt aus die StApp aus und speichere diese als JSON. So brauche ich den Baum nicht builden, sondern kann direkt den Decompressor verwenden:
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.AccessFlag;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.io.*;
import java.nio.charset.Charset;
import org.json.JSONArray;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.CodeIterator;
import javassist.bytecode.MethodInfo;
import javassist.bytecode.analysis.Type;
import java.util.Base64;
public class Demo extends hn {
private String HuffmanTree = null;
private String GenericProtocol = null;
private HashMap<String, String> data = new HashMap();
public Demo(String hostname, int port) {
super(hostname, port);
try {
ClassPool classPool = ClassPool.getDefault();
Class<?> groupChat = this.getClass();
Class<?> client = groupChat.getSuperclass();
for(Field f : client.getDeclaredFields()) {
f.setAccessible(true);
if(f.getGenericType().getTypeName().equals("java.lang.String")) {
String value = (String) f.get(this);
if(value == null) {
continue;
}
if(value.startsWith("\b") && value.length() > 10) {
this.HuffmanTree = value;
data.put("HUFFMAN", f.getName());
} else if(value.startsWith("-") && value.length() > 10) {
this.GenericProtocol = value;
data.put("GENERIC_PROTOCOL", f.getName());
}
} else {
//System.out.println(f.getGenericType().getTypeName());
}
}
// private final void hn.v2(java.lang.String)
Method found = null;
int count = 0;
for(Method m : client.getDeclaredMethods()) {
if(found != null) {
break;
}
if(m.accessFlags().contains(AccessFlag.PRIVATE) && m.accessFlags().contains(AccessFlag.FINAL)) {
if(m.getGenericReturnType().getTypeName().equals("void")) {
java.lang.reflect.Type[] params = m.getGenericParameterTypes();
if(params.length == 1) {
if(params[0].getTypeName().equals("java.lang.String")) {
CtMethod method = classPool.get(client.getName()).getDeclaredMethod(m.getName());
MethodInfo methodInfo = method.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
CodeIterator codeIterator = codeAttribute.iterator();
while (codeIterator.hasNext()) {
int index = codeIterator.next();
int opcode = codeIterator.byteAt(index);
if(javassist.bytecode.Mnemonic.OPCODE[opcode] == "new") {
++count;
if(count == 2) {
found = m;
break;
}
}
}
}
}
}
}
}
/* Init Huffman */
Method method = client.getDeclaredMethod(found.getName(), String.class);
method.setAccessible(true);
method.invoke(this, this.HuffmanTree);
/* Get Decoder */
Field field = client.getDeclaredField("ra");
field.setAccessible(true);
Object fieldValue = field.get(client);
Class<? extends Object> Encoder = fieldValue.getClass();
/* Call the Decoder */
Method mm = Encoder.getDeclaredMethod("v", byte[].class);
method.setAccessible(true);
Object result = mm.invoke(fieldValue, new byte[] { (byte) 0xb4, (byte) 0x1b, (byte) 0xf8, (byte) 0x16,(byte) 0x8d, (byte) 0x51, (byte) 0xb5, (byte) 0x44, (byte) 0x5f, (byte) 0xb5, (byte) 0xa4 });
System.out.println("Method Result: " + result);
Field parsed = Encoder.getDeclaredField("o");
parsed.setAccessible(true);
Object[] parsedValue = (Object[]) parsed.get(fieldValue);
String json = new JSONArray(parsedValue).toString();
System.out.println(Base64.getEncoder().encodeToString(json.getBytes()));
//System.out.println("o = " + new JSONArray(parsedValue).toString());
try (FileOutputStream fos = new FileOutputStream("TreeJS.json")) {
System.err.println("SAVE TREE");
fos.write(json.getBytes());
// Eingabestream mit Cp-1215 Encoding
InputStream inputStream = new FileInputStream("TreeJS.json");
Reader reader = new InputStreamReader(inputStream, Charset.forName("cp1252"));
// Ausgabestream mit UTF-8 Encoding
OutputStream outputStream = new FileOutputStream("TreeUC.json");
Writer writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));
// Puffer für die Daten
char[] buffer = new char[1024];
int bytesRead;
while ((bytesRead = reader.read(buffer)) != -1) {
writer.write(buffer, 0, bytesRead);
}
// Streams schließen
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
Field e = Encoder.getDeclaredField("e");
e.setAccessible(true);
System.out.println("e = " + e.get(fieldValue));
Field t = Encoder.getDeclaredField("t");
t.setAccessible(true);
System.out.println("t = " + t.get(fieldValue));
Field p = Encoder.getDeclaredField("p");
p.setAccessible(true);
System.out.println("p = " + p.get(fieldValue));
Field z = Encoder.getDeclaredField("z");
z.setAccessible(true);
System.out.println("z = " + z.get(fieldValue));
Field k = Encoder.getDeclaredField("k");
k.setAccessible(true);
System.out.println("k = " + k.get(fieldValue));
Field v = Encoder.getDeclaredField("v");
v.setAccessible(true);
System.out.println("v = " + v.get(fieldValue));
Field r = Encoder.getDeclaredField("r");
r.setAccessible(true);
byte[] rVal = (byte[]) r.get(fieldValue);
System.out.println("r = " + new JSONArray(rVal).toString());
/*
/* Get Encoder var
for(Field dd : Encoder.getDeclaredFields()) {
System.out.println(dd.getName());
dd.setAccessible(true);
System.out.println(dd.get(fieldValue));
}
*/
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Demo("chat.knuddels.de", 2710);
}
@Override
public void n(String arg0) {}
@Override
public void nf() {}
@Override
public void oc() {}
@Override
public void ow(Font arg0, Font arg1, String arg2) {}
@Override
public void ro() {}
@Override
public void v(String arg0, String arg1) {}
}
Das Resultat schaut dann wie folgt aus:
[[[[[[[[[null,"y"],[null,"|/serverpp \""]],[[[null,"tt"],[null,"D"]],[[[[[null,"ea"],[[null,"ud"],[[[null,"\u0083"],[[[null,"з"],[[null,"Ú"],[null,"Þ"]]],[null,"\u20ac"]]],[[null,"\u203e"],[null,"\u0085"]]]]],[[null,"ür"],[null,"È"]]],[[null,"Ste"],[null,"eck"]]],[[null,"06"],[[null,"Mafia"],[[[null,"67"],[null,"NI"]],[[null,"lb"],[null,"ou"]]]]]]]],[null,"#"]],[null,"\n"]],[null,"°"]],[[[[[[[[null,"si"],[null,"pla"]],[[null,"ti"],[null,"for"]]],[null,"\f"]],[[[[[null,"boy"],[null,"\r"]],[[null,"man"],[[null,"Kl"],[[null,"97"],[null,"ub"]]]]],[[[null,"urg"],[null,"kte"]],[[null,"OK"],[null,"ue"]]]],[null,"b"]]],[[[[[[null,"op"],[[null,"ev"],[null,"Ob"]]],[[[null,"per"],[null,"Ko"]],[null,"Mo"]]],[null,"_°>_h"]],[null,"m"]],[[[[null,"di"],[null,"ra"]],[[[null,"j"],[[[[[null,"\u0082"],[[[[null,"ÏŠ"],[null,"Ù"]],[null,"Æ"]],[null,"Å¡"]]],[[null,"¹"],[[null,"â–¬"],[[null,"É"],[null,"ø"]]]]],[null,"53"]],[[null,"lh"],[[null,"\u2022"],[null,"`"]]]]],[null,"py"]]],[[null,"13"],[null,"nn"]]]]],[[[null,"ã"],[[[[[null,"rc"],[null,"_nicklist_"]],[[null,"ef"],[null,"bra"]]],[[null,"ee"],[[null,"ten"],[null,"nc"]]]],[[[null,"?d="],[[null,"Wo"],[[[null,"77"],[null,"ú"]],[null,"94"]]]],[[null,"ing"],[[null,"\u000e"],[null,"02"]]]]]],[[[[[null,"De"],[null,"au"]],[[[[null,"Ru"],[[null,"oy"],[null,"km"]]],[null,"eig"]],[[null,"Es"],[[null,"ks"],[null,"Ol"]]]]],[null,"5"]],[[[null,"E"],[[null,"ii"],[[null,"\u0016"],[[[null,"mf"],[null,"Fo"]],[[null,"sk"],[[[[null,"²"],[[null,"â•�"],[null,"\u009e"]]],[[[[null,"ï*¼"],[null,"ﺡ"]],[[null,"ﺦ"],[null,"\u2019"]]],[[null,"Ä™"],[[null,"ﮎ"],[null,"ﻶ"]]]]],[null,"\u0015"]]]]]]],[[[[null,"Er"],[[null,"use"],[null,"On"]]],[[null,"ol"],[[null,"89"],[[null,"kö"],[null,"Ze"]]]]],[[null,"art"],[null,"ri"]]]]]]],[[[[[null,"w"],[[[[null,"co"],[[[[null,"\u0019"],[null,"Ä"]],[null,"Ct"]],[null,"va"]]],[null,"bi"]],[[null,"lin"],[[null,"hr"],[null,"id"]]]]],[[[[[null,"do"],[null,"nk"]],[[null,"xx"],[[[null,"wb"],[[null,"\u0018"],[[[null,"к"],[null,"Ã�"]],[null,"\u008b"]]]],[[null,"ph"],[null,"fw"]]]]],[[[null,"noc"],[null,"we"]],[null,"yer"]]],[[[null,"fe"],[[null,"ko"],[null,"ht"]]],[[null,"mi"],[[null,"100"],[null,"31"]]]]]],[[null,"3"],[null,"l"]]],[[[[[[null,"W"],[null,"fc"]],[[[[[null,"kü"],[[[null,"в"],[[null,"ù"],[[[null,"Ò“"],[null,"â„¢"]],[null,"а"]]]],[null,"´"]]],[null,"iz"]],[null,"09"]],[null,"BN"]]],[[null,"im"],[null,"\u0001"]]],[[null,"\u0000p\u0000"],[[[[[null,"Kr"],[[null,"Oo"],[null,"eg"]]],[null,"Pun"]],[[null,"yl"],[null,"eh"]]],[[[null,"Ro"],[null,"Su"]],[[[null,"xe"],[null,"hel"]],[null,"hlt"]]]]]],[[[[[null,"et"],[null,"sm"]],[[null,"M"],[[null,"pa"],[null,"38"]]]],[[null,"z"],[[[[null,"Fl"],[null,"48"]],[null,"uf"]],[[null,"Knu"],[null,"Ni"]]]]],[[[[[null,"hi"],[[[null,"lz"],[null,"Ãœ"]],[null,"her"]]],[[null,"So"],[[[null,"Sü"],[null,"uh"]],[[[[null,"→"],[null,"â–‘"]],[null,"н"]],[null,"rü"]]]]],[null,"Fh"]],[[[null,"Min"],[null,"ba"]],[[null,"pl"],[null,"0,0,0"]]]]]]]]],[[[[[[[[null,"17"],[null," "]],[[[[null,"bin"],[[null,"Gl"],[null,"Nu"]]],[null,"Mafia2"]],[[null,"da"],[[[null,"Rh"],[null,"ken"]],[null,"Sl"]]]]],[[[[null,"I"],[[null,"knuddel"],[null,"Fb"]]],[[null,"Bo"],[[[null,"To"],[[null,"za"],[[[[null,"Æ’"],[[null,"µ"],[null,"â–“"]]],[null,"\u0086"]],[null,"и"]]]],[[null,"Go"],[null,"56"]]]]],[[[[null,"ois"],[null,"ce"]],[null,"N"]],[[[null,"03"],[[null,"rb"],[null,"hn"]]],[[null,"rie"],[[null,"Je"],[null,"Dr"]]]]]]],[[[null,"4"],[[[[null,"Fuß"],[[null,"Ju"],[[null,"ny"],[null,"Yo"]]]],[null,"36"]],[[[null,"hei"],[[[null,"58"],[null,"ov"]],[null,"$"]]],[null,"BB"]]]],[[null,"&"],[[[null,"Bingo"],[[null,"lie"],[[null,"by"],[null,"Ig"]]]],[[null,"ste"],[null,"\u0011"]]]]]],[[[null,"2"],[[[[null,"G"],[[null,"ic"],[[null,"kle"],[[[[[[[null,"ï»»"],[null,"Я"]],[null,"Ñ’"]],[null,"Ã*"]],[[null,"Û—"],[[[null,"е"],[null,"Ã�"]],[[null,"Õ"],[null,"│"]]]]],[[[[null,"î"],[null,"â•”"]],[null,""]],[null,"Ö"]]],[null,"64"]]]]],[[null,"se"],[null,"23"]]],[[[null,"ng"],[[null,"wa"],[[null,"Dü"],[null,"fl"]]]],[[null,"ar"],[[null,"rs"],[null,"Bi"]]]]]],[null,"\u0000p\u0000B\u0000-\u0000"]]],[[[[null,"õ"],[null,","]],[[[null,"Â"],[[[null,"ute"],[null,"ve"]],[[null,"@"],[[[null,"sl"],[null,"ac"]],[null,"He"]]]]],[null,"B"]]],[[[[null,"20"],[[[[null,"Wi"],[[[null,"cl"],[null,"Mö"]],[null,"dm"]]],[null,"Ma"]],[null,"le"]]],[null,"i"]],[[[[[[null,"ot"],[[[null,"sc"],[null,"uu"]],[null,"\t"]]],[null,"S"]],[[[null,"geb"],[null,"Me"]],[[null,"female.b.my_4.gif"],[null,"tl"]]]],[[null,"16"],[[null,"cht"],[[[[null,"lä"],[null,"pu"]],[[null,"sb"],[null,"51"]]],[null,"Fif"]]]]],[[[[[null,"90"],[null,"erh"]],[null,"255"]],[[null,"K"],[null,"ig"]]],[null,"|"]]]]]],[[[[[[[null,"ma"],[[[null,"29"],[[[null,"Am"],[[[null,"♫"],[[null,"\u203a"],[[null,"\u009d"],[null," "]]]],[[[[null,"þ"],[null,"â†�"]],[[null,"\u0099"],[null,"Å�"]]],[null,"м"]]]],[null,"Kö"]]],[[null,"von"],[null,"Ki"]]]],[[[[[[null,"äu"],[null,"Ce"]],[[null,"78"],[null,"Gi"]]],[null,"nu"]],[null,"gen"]],[[[null,"du"],[[null,"Mar"],[null,"ru"]]],[[[null,"vo"],[null,"ju"]],[[[null,"â„“"],[null,"bs"]],[null,"uhp"]]]]]],[[[null,"FotoContest"],[[[null,"Cp"],[[null,"tor"],[null,"rea"]]],[[null,"zi"],[null,"kann"]]]],[[null,"ll"],[null,"?"]]]],[[[null,"û"],[null,"¾"]],[[[[[null,"mp"],[[null,"ln"],[null,"Spi"]]],[null,"us"]],[null,"st"]],[[[[[null,"rf"],[[null,"\u0006"],[null,"\u008f"]]],[null,"ff"]],[[null,"sh"],[[null,"44"],[null,"Ic"]]]],[[null,"hat"],[[null,"ja"],[[null,".w_"],[null,"\u0014"]]]]]]]],[[[[null,"g"],[[[[null,"27"],[[[null,"Ar"],[null,"Ñ”"]],[null,"üb"]]],[null,"ie"]],[null,"10"]]],[[[[[[null,"Und"],[null,"ies"]],[[null,"91"],[[[null,"¶"],[[null,"é"],[[null,"Ø"],[[[null,"Å‹"],[null,"â–€"]],[null,"ç"]]]]],[null,"II"]]]],[[null,"go"],[[null,"ob"],[null,"'"]]]],[null,"knuddels.de"]],[null,"x"]]],[[[[[null,"["],[[null,"nge"],[[null,"lt"],[[null,"88"],[null,"Zi"]]]]],[[[null,"Na"],[null,"Fa"]],[null,"]"]]],[null,"¼"]],[[[[null,"ä"],[[null,"aus"],[null,"sich"]]],[null,"icon"]],[[null,"6"],[[[[null,"â–ˆ"],[null,"Gr"]],[null,"po"]],[null,"30"]]]]]]],[[[[null,">"],[[[[null,"Sch"],[[[null,"par"],[null,"ey"]],[[null,"Ga"],[null,"Nor"]]]],[null,"mafia"]],[[null,"12"],[[[[null,"Ja"],[null,"sü"]],[[[[[null,"¸"],[null,"\u008a"]],[[null,"\u001b"],[null,"\u0087"]]],[null,"ön"]],[null,"mag"]]],[null,"ver"]]]]],[[[[[[null,"Ge"],[null,"¤"]],[null,"22"]],[[[[null,"ag"],[[null,"72"],[[null,"\u0090"],[[null,"ô"],[null,"\u0088"]]]]],[null,"hal"]],[null,"21"]]],[[[[null,"ro"],[[null,"Ps"],[[null,"59"],[null,"Fu"]]]],[null,"la"]],[[[null,"60"],[null,"P"]],[[null,"Stu"],[[null,"mu"],[[null,"Aa"],[null,"62"]]]]]]],[null,"n"]]],[[[null,":"],[[[[[null,"dt"],[[null,"ONL"],[null,"92"]]],[null,"|/go "]],[[null,"Channel"],[[null,"bei"],[null,"Hi"]]]],[[null,"\u0002"],[null,"8"]]]],[[[[null,"f"],[[null,"200"],[[[[null,"fo"],[null,"hm"]],[null,"ros"]],[null,"gl"]]]],[null,"0"]],[[[[[[null,"49"],[null,"ens"]],[null,"34"]],[[[null,"swh"],[null,"bt"]],[[[null,"HP"],[[[[[[null,"Ó"],[null,"â–’"]],[[null,"Ç"],[null,"Ñ"]]],[[null,"√"],[null,"↓"]]],[null,"â"]],[[[null,"±"],[null,"Ξ"]],[null,"\u0084"]]]],[null,"Bad"]]]],[[null,"ed"],[[[null,"\u000f"],[null,"tde"]],[null,".png"]]]],[[null,"d"],[[[[null,"mb"],[null,"kn"]],[null,"Da"]],[[null,"ir"],[[null,"Gir"],[null,"2009"]]]]]]]]]]]],[[[[[[[[null,"00"],[[[[null,"Pri"],[[null,"Bre"],[null,"Te"]]],[[[[null,"Ve"],[null,"54"]],[null,"Sh"]],[null,"Who"]]],[[[[null,"ft"],[null,"Ne"]],[null,"Xx"]],[null,"James"]]]],[[[[[null,"Cl"],[null,"mo"]],[[[null,"ang"],[null,"ÃŒ"]],[[null,"Wu"],[null,"04"]]]],[null,"9"]],[[[[null,"0065"],[[[null,"CH"],[null,"ci"]],[null,"gh"]]],[null,"ke"]],[[[[null,"ur"],[null,"ak"]],[[null,"ia"],[null,"wu"]]],[null,"pics/"]]]]],[[[[[null,"den"],[[null,"Lo"],[null,"sta"]]],[[[[[null,"GB"],[null,"sbu"]],[[null,"oh"],[null,"qu"]]],[null,"Sa"]],[null,"li"]]],[[null,"a"],[[null,"O"],[[[null,"Fe"],[[null,"xy"],[[[[[[null,"£"],[null,"о"]],[null,"\u009a"]],[null,"©"]],[[[null,"÷"],[null,"â•—"]],[[[null,"─"],[null,"\u201c"]],[[null,"Â*"],[null,"½"]]]]],[[null,"«"],[[[null,"â•š"],[[null,"Ë"],[null,"ò"]]],[[null,"Â¥"],[null,"ó"]]]]]]],[null,"nich"]]]]],[[[[[[null,"bes"],[null,"tc"]],[[null,"¬"],[null,"♥"]]],[[null,"men"],[null,"St"]]],[[null,"bur"],[null,"rt"]]],[[[[[null,"93"],[null,"Wa"]],[[null,"Ti"],[null,"07"]]],[[null,"ga"],[[null,"ds"],[[null,"99"],[null,"Mu"]]]]],[null,"sch"]]]]],[[[[[[[[null,"Jo"],[null,"Her"]],[[[null,"gg"],[null,"vb"]],[null,"ib"]]],[[null,"ent"],[[[null,"87"],[null,"ya"]],[null,"lf"]]]],[[[null,"or"],[[null,"eb"],[null,"aw"]]],[[null,"\u0012"],[null,"tz"]]]],[null,"ch"]],[[[[[[null,"rl"],[null,".shadow_"]],[null,"sp"]],[[[null,"to"],[null,"oo"]],[null,"*"]]],[null,"15"]],[[null,"o"],[[[[[null,"nf"],[null,"86"]],[null,"95"]],[[null,"INE"],[null,"Si"]]],[[null,"Foto"],[[null,"ys"],[[null,"96"],[[[null,"\u001a"],[null,"\u001f"]],[[null,"\u0098"],[[null,"á"],[[null,"Ô"],[[null,"Ñ—"],[null,"ì"]]]]]]]]]]]]],[[null,"r"],[[[[null,"ist"],[[[null,"Lad"],[null,"Mom"]],[[null,"Th"],[null,"Pro"]]]],[[[null,"ka"],[null,"Ch"]],[null,"ni"]]],[[null,"ss"],[[null,".my_"],[[null,"vi"],[[null,"Mon"],[null,"pi"]]]]]]]]],[[[[[[[[[null,"Qf"],[[null,"oc"],[null,"sg"]]],[[[null,"Ta"],[null,"tw"]],[[null,"if"],[null,"zz"]]]],[null,"na"]],[[[[null,"Au"],[null,"ai"]],[null,"Knuddels"]],[null,"X"]]],[null,"°>_h"]],[[[[[[[[null,"ug"],[null,"My"]],[null,"Pe"]],[[null,"ex"],[null,"No"]]],[null,"Ka"]],[[null,"no"],[[[null,"xt"],[null,"hp"]],[[null,"kr"],[null,"Pu"]]]]],[null,"18"]],[[null,"R"],[[[null,"Sin"],[null,"An"]],[[[[null,"Ri"],[null,"sel"]],[null,"bea"]],[[null,"Vo"],[[null,"ah"],[null,"Qu"]]]]]]]],[[null,"+"],[[[[null,"c"],[[[null,"ts"],[null,"Tr"]],[null,"We"]]],[[null,"L"],[null,"icon_gender_"]]],[[[null,"me"],[[null,".h_"],[[null,"www"],[[null,"yo"],[null,"hu"]]]]],[[null,"|/fotowhois \""],[[null,"mit"],[null,"so"]]]]]]],[[[[null,"\u000b"],[[[null,"Fre"],[[[null,"max"],[null,"reg"]],[[null,"Va"],[null,"wer"]]]],[[null,"u"],[[[null,"wie"],[null,"icons/"]],[[null,"En"],[[[[null,"â•�"],[[null,"\u0095"],[null,"×"]]],[null,"\u009f"]],[null,"jo"]]]]]]],[null,"%"]],[[[[[null,"255,255,255"],[[null,"ei"],[[null,"dr"],[null,"ip"]]]],[[[null,"Du"],[[[null,"kf"],[null,"57"]],[null,"Pl"]]],[null,"lo"]]],[[[[null,"Sta"],[[[[null,"α"],[[null,"\u001d"],[[[null,"Ï„"],[null,"Ã’"]],[null,"\u0091"]]]],[null,"ER"]],[null,"ku"]]],[[null,"ls"],[[null,"act"],[null,"Fr"]]]],[[null,"\\"],[[null,"fotos/knuddels.de?n="],[null,"H"]]]]],[[null," "],[[[[[null,"Lu"],[null,"dem"]],[null,"end"]],[[[[[null,"Bü"],[null,"ap"]],[null,"74"]],[null,"chl"]],[null,"gle"]]],[null,"40"]]]]]]],[[[[[[[null,"!"],[null,"32"]],[[[null,"ein"],[[null,"sei"],[[null,"Ke"],[null,"ß"]]]],[[[null,"fg"],[null,"bal"]],[null,"ta"]]]],[[[null,"19"],[[null,"nde"],[[[null,"Men"],[null,"Lie"]],[null,"ad"]]]],[[[null,"Sf"],[null,"§"]],[null,"in"]]]],[[[[[[[[[null,"ec"],[[null,"\u001e"],[[null,"\u2039"],[[null,"Ã�"],[[null,"¦"],[null,"ê"]]]]]],[[null,"ι"],[null,"Hü"]]],[null,"os"]],[null,"rn"]],[[null,".mx_"],[null,"wei"]]],[null,".."]],[[[[[null,"ler"],[null,"rk"]],[null,"q"]],[[[[null,"tf"],[null,"Un"]],[null,"Po"]],[null,"Ver"]]],[null,"p"]]],[null,"/"]]],[[[[[[[[null,"}"],[[[null,"dw"],[[null,"Ñ•"],[[null,"\u0092"],[null,"ë"]]]],[null,"az"]]],[[null,"lu"],[null,"Fi"]]],[[[null,"kl"],[null,"wo"]],[null,"80"]]],[null,"\u0000p\u0000B\u0000pics/icon_fullChannel.gif\u0000-\u0000"]],[[null,"el"],[[null,"ty"],[[[null,"Neu"],[[null,"52"],[null,"lm"]]],[null,"01"]]]]],[[null,"|/w \"<"],[[[[[null,".quadcut_"],[[[null,"69"],[null,"dä"]],[null,"tu"]]],[[null,"fre"],[[null,"ih"],[[null,"ez"],[null,"98"]]]]],[null,"te"]],[[[null,"gir"],[null,"cnt"]],[[null,".border_"],[null,"it"]]]]]],[[[[[[null,"Y"],[null,"fullChannel.gif"]],[[[[null,"zo"],[null,"kc"]],[[null,"Ab"],[[[null,"Ï…"],[[[[null,"â–ª"],[[null,"â•©"],[null,"â„®"]]],[null,"Ê"]],[null,"\u008d"]]],[null,"82"]]]],[null,"33"]]],[[null,"nd"],[null,"F"]]],[[[[null,"Sp"],[null,"^"]],[[[null,"ach"],[null,"uc"]],[null,"ki"]]],[[null,"ich"],[[[[null,"fel"],[[null,"83"],[[null,"¿"],[null,"Û"]]]],[null,"br"]],[[null,"Fri"],[null,"dor"]]]]]],[[[[null,"de"],[null,"50"]],[[[[null,"aa"],[[null,"gb"],[null,"lc"]]],[[null,"für"],[null,"75"]]],[[null,"th"],[null,"Ber"]]]],[[[[[null,"Bal"],[null,"70"]],[[null,"45"],[[null,"Sw"],[null,"41"]]]],[[null,"il"],[[null,"hfl"],[[null,"Ih"],[null,"~"]]]]],[[null,"pics/female.gif"],[[null,"htt"],[[[[[[null,"♪"],[[[null,"¡"],[null,"è"]],[[null,"ı"],[[null,"\u2014"],[[null,"\\\\\\"],[null,"Ó™"]]]]]],[null,"·"]],[null,"At"]],[[null,"LE"],[null,"Sk"]]],[null,"2010"]]]]]]]]],[[[[[null,".gif"],[[[[null,"foto"],[[null,"Lan"],[[null,"\u0013"],[null,"ik"]]]],[null,"°>gt.gif<°"]],[[[null,"Ho"],[[[null,"dy"],[null,"Pi"]],[null,"alt"]]],[[null,"28"],[null,".jpg"]]]]],[null,"e"]],[[[null,"s"],[[[[null,"El"],[[null,"mer"],[null,"male.b.my_3.gif"]]],[null,"\u0000Flirt "]],[[[[[[null,"Ñ�"],[null,"76"]],[null,"nb"]],[null,"La"]],[null,"ns"]],[[[null,"rg"],[null,"08"]],[null,"Be"]]]]],[[[[[null,"v"],[[[null,"ml"],[[null,"cd"],[null,"73"]]],[null,"Bu"]]],[[null,"tr"],[null,"wi"]]],[[null,"mm"],[[[null,"sf"],[null,"Die"]],[null,"nt"]]]],[[[[null,"ly"],[[null,"em"],[null,"tmu"]]],[[[[null,"od"],[null,"sd"]],[null,"Kis"]],[[[null,"DD"],[[[[null,"\u0097"],[[null,"¨"],[null,"ÃŽ"]]],[null,"η"]],[null,"68"]]],[null,"Q"]]]],[[null,"ge"],[[[[[null,"84"],[null,"FC"]],[null,"gs"]],[null,"Ra"]],[[null,"su"],[[null,"iv"],[[null,"hh"],[null,"Pr"]]]]]]]]]],[[[null,"<"],[[[[null,"ha"],[null,"on"]],[[null,"T"],[null,"che"]]],[null,"h"]]],[[null,"\""],[[[[[[null,"cloudsblue.gif"],[[null,"Ci"],[null,"\u0003"]]],[[[null,"lig"],[[null,"\u0017"],[[[null,"\u008e"],[null,"\u0096"]],[[[[null,"ñ"],[null,"ý"]],[[null,"®"],[null,"у"]]],[[[[null,"ή"],[null,"Ä°"]],[[null,"Å‚"],[null,"Å„"]]],[null,"Ï�"]]]]]],[null,"bb"]]],[[null,"ber"],[null,"Li"]]],[[[[null,"Di"],[[null,"¯"],[null,"lg"]]],[[null,"Al"],[null,"Out"]]],[[null,"24"],[null,"un"]]]],[[[[null,"39"],[[[null,"urt"],[[null,"Is"],[null,"Rf"]]],[null,"71"]]],[[[null,"hl"],[null,"Bl"]],[null,"Ba"]]],[[[null,"ear"],[[null,"ech"],[[null,"Us"],[null,"47"]]]],[[[null,"ipi"],[null,";"]],[null,"ze"]]]]]]]]]],[[[[[[null,"."],[[[null,"7"],[[null,"at"],[[[[null,"wä"],[[null,"Hu"],[[null,"∂"],[[null,"º"],[[null,"ð"],[null,"ﻹ"]]]]]],[null,"ße"]],[[null,"ut"],[null,"fu"]]]]],[[[null,">--<"],[null,"an"]],[[[null,"Le"],[null,"sa"]],[[[[null,"\u0004"],[null,"gt"]],[null,"je"]],[null,"pwd"]]]]]],[[[[[[null,"Re"],[null,"he"]],[[null,"ho"],[[[null,"om"],[null,"ok"]],[null,"55"]]]],[[null,"war"],[[null,"hen"],[[[null,"pe"],[[null,"ek"],[null,"LL"]]],[null,"bu"]]]]],[[[null,"re"],[[[[null,"wü"],[null,"66"]],[null,"Se"]],[null,"Z"]]],[[[[null,"üc"],[[null,"Cr"],[null,"gu"]]],[null,"zu"]],[[[null,"J"],[[null,"mä"],[null,"42"]]],[[null,"bo"],[null,"Ca"]]]]]],[[[[null,"es"],[[[null,"Tag"],[[[null,"RR"],[null,"ry"]],[null,"\u0005"]]],[null,"26"]]],[[[[[null,"rr"],[null,"of"]],[null,"Dor"]],[null,"res"]],[[null,"cgi"],[[null,"dd"],[null,"|http://www3.knuddels.de:8080/txtl/click?d=knuddels.de&id="]]]]],[[[[[null,"Sm"],[[null,"43"],[null,"af"]]],[null,"ine"]],[[[null,"Co"],[[[[[[[null,"ª"],[null,"³"]],[null,"Σ"]],[null,"\u0089"]],[null,"»"]],[null,"CE"]],[null,"lk"]]],[null,"am"]]],[[[null,"pp"],[[null,"sw"],[[[null,"63"],[null,"my"]],[[null,"pf"],[[[[null,"\u009c"],[null,"æ"]],[null,"\u008c"]],[null,"\u001c"]]]]]],[[[null,"fhe"],[[null,"\b"],[null,"Vi"]]],[null,"ter"]]]]]]],[[[[[[null,"ÿ"],[null,"11"]],[[[[null,"fa"],[[[null,"sr"],[null,"Mf"]],[null,"\u0010"]]],[[null,"°>sm_"],[null,"Anz"]]],[null,"A"]]],[[[[null,"as"],[[[[null,"NR"],[null,"lr"]],[[null,"NT"],[null,"61"]]],[null,"nz"]]],[[[null,"ab"],[null,"gi"]],[[null,"dpg"],[null,"gr"]]]],[null,"("]]],[[[[null,"pics/male.gif"],[[null,"pg"],[[[[null,"Cu"],[[[[[[null,"δ"],[null,"Ï‚"]],[[null,"Ûš"],[null,"↔"]]],[[null,"Ñ–"],[null,"â–º"]]],[[null,"Û–"],[[[null,"Ä‘"],[null,"ħ"]],[[null,"Ƨ"],[null,"Û™"]]]]],[[[[null,"ν"],[null,"Ñ�"]],[null,"Ã�"]],[[null,"Ã*"],[[null,"â—�"],[null,"\u201d"]]]]]],[null,"Os"]],[null,"ow"]]]],[[null,"ck"],[[null,"Ã¥"],[null,"Ha"]]]],[[[[[[[null,"gd"],[null,"It"]],[null,"kt"]],[null,"len"]],[[null,"Ei"],[[null,"\u0007"],[null,"fr"]]]],[null,"C"]],[null,")"]]]],[[[[[[[null,"min"],[null,"Sie"]],[[null,"{"],[[null,"65"],[null,"Mü"]]]],[[null,"ö"],[[[[null,"Nü"],[null,"Do"]],[null,"io"]],[null,"Pf"]]]],[[[[null,"das"],[null,"V"]],[null,"Flirt"]],[[null,"ü"],[[[null,"rz"],[[null,"Gu"],[null,"fm"]]],[null,"Ham"]]]]],[null,"t"]],[[null,"en"],[null,"er"]]]]],[null,"\u0000"]],[[[[[[[[null,"der"],[[[null,"Cc"],[null,"Alt"]],[null,"Mix"]]],[[[[[[null,"As"],[null,"tp"]],[null,"nen"]],[null,"ld"]],[null,"05"]],[null,"is"]]],[[[[null,"Ã"],[[[null,"Lü"],[[[null,"Û˜"],[null,"Û¡"]],[[null,"Û¢"],[null,"¢"]]]],[null,"Ges"]]],[[[null,"auf"],[null,"and"]],[[null,"blg"],[null,"pr"]]]],[[null,"und"],[null,"al"]]]],[[[[[[[null,"In"],[null,"Wü"]],[null,"hie"]],[[null,"ges"],[[null,"öß"],[null,"ps"]]]],[null,"be"]],[[[null,"25"],[[null,"140"],[[[null,"hs"],[[[null,"ω"],[null,"ï"]],[[null,"\u0093"],[null,"σ"]]]],[null,"46"]]]],[null,"\u0080"]]],[[[null,"14"],[[null,"35"],[[null,"Em"],[null,"ger"]]]],[[null,"cg"],[null,"k"]]]]],[null,"-"]],[[[[[[[[[null,"wh"],[[null,"rp"],[[[[null,"\u0094"],[[null,"Λ"],[null,"\u009b"]]],[null,"â•‘"]],[[null,"\u0081"],[[null,"Ã�"],[[[null,"ÄŸ"],[null,"Æ�"]],[[null,"â–*"],[null,"â—„"]]]]]]]],[null,"Pa"]],[null,"U"]],[[null,"bl"],[[null,"ca"],[null,"vat"]]]],[[[[null,"37"],[[null,"eu"],[null,"ms"]]],[[null,"Mi"],[null,"cs"]]],[[null,"die"],[[null,"ay"],[null,"fi"]]]]],[[[null,"À"],[[null,"um"],[null,"sen"]]],[null,"="]]],[[[[[[null,"Br"],[[null,"ul"],[null,"fy"]]],[null,"vor"]],[[[null,"Wl"],[null,"tsc"]],[null,"rd"]]],[[null,"ne"],[[[[null,"Ku"],[[[null,"ε"],[null,"Ñ‚"]],[null,"Rü"]]],[null,"Par"]],[[[[null,"85"],[null,"wc"]],[null,"cr"]],[null,"rm"]]]]],[null,"1"]]],[null,"_"]]],[null," "]]]]]
Und so nun in Javascript mein Decompressor:
import Tree from '../../../Data/Tree.json' with { type: 'json' };
export default (new class Huffman {
constructor() {
this.compressedData = "\\\\\\";
this.buffer = Tree; //new Array(2);
this.totalBytesProcessed = 0;
this.totalBytesWritten = 0;
this.finished = false;
this.rawData = undefined;
this.readIndex = 0;
this.writeIndex = 0;
}
decompress(buffer) {
if(typeof(buffer) === 'undefined' || buffer === null) {
return null;
}
let uncompressed = [];
this.rawData = buffer;
this.readIndex = 0;
this.writeIndex = 0;
this.finished = false;
let ast = [ this.buffer ];
do {
try {
ast = ast[this.getBitValue()];
if(ast[0] == null) {
if(ast[1] == this.compressedData) {
let i = 0;
for(let j = 0; j < 16; j++) {
i += this.getBitValue() << j;
}
uncompressed.push(String.fromCharCode(i));
} else {
uncompressed.push(ast[1]);
}
ast = this.buffer;
}
} catch(e) {}
} while(!this.finished);
let result = uncompressed.join('');
this.totalBytesWritten += result.length;
this.totalBytesProcessed += buffer.length;
return result;
}
getBitValue() {
try {
let result = 0;
if((this.rawData[this.writeIndex] & 1 << this.readIndex) != 0) {
result = 1;
}
this.readIndex++;
if(this.readIndex > 7) {
++this.writeIndex;
this.readIndex = 0;
this.finished = (this.writeIndex === this.rawData.length);
}
return result;
} catch(e) {
return 0;
}
}
}());
Das Problem, was ich allerdings habe:
Er ermittelt nicht richtig das Resultat.
In dem Java-Crapper, der den Tree holt wird es korrekt dargestellt:
5\0James\0Mentorsystem
Über Javascript allerdings:
i\0James\0Mentorsystem
Im SYSTEM-BOT Packet "5", da es so klein ist, ist nur der Opcode betroffen.
Das lesen des Paketes aus dem Stream scheint auch korrekt zu funktionieren:
export default (new class Packet {
DecodeKey = null;
decode(buff) {
let pos = 0;
let first = buff[pos++];
if(first === null) {
return null;
}
if(first == -1) {
return null;
}
let length = 0;
if(first >= 0) {
length = first + 1;
} else {
length = (first & 0x1F) + 1;
let count = (first & 0x60) >>> 5;
for(let i = 1; i < count; i++) {
let nextByte = buff[pos++];
if(nextByte == -1) {
throw new IOException("Unexpected end of stream");
}
length += nextByte << (i - 1) * 8;
}
}
let buffer = Buffer.alloc(length);
for(let i = 0; i < length; i++) {
let readByte = buff[pos++];
if(readByte == -1) {
throw new IOException("Unexpected end of stream");
}
buffer[i] = (readByte ^ (this.DecodeKey != null && i < this.DecodeKey.length ? this.DecodeKey[i] : 0));
}
//console.log('[Packet]', length, buffer.length);
return new Uint8Array(buffer);
}
encode(message) {
if(typeof(message) === 'undefined') {
return null;
}
const length = message.length - 1;
let len;
if(length < 128) {
len = Buffer.from([ length ]);
} else {
let count = 0;
console.log("ZWO");
while((32 << ((count + 1) << 3)) <= length) {
//while(32 << (count + 1 << 3) <= length) {
count++;
}
count++;
len = Buffer.alloc(count + 1);
len[0] = (count << 5) | 0x80 | (length & 0x1F);
//len[0] = (count << 5 | 0x80 | length & 0x1F);
for(let i = 1; i < len.length; i++) {
len[i] = (length >>> (8 * (i - 1)) + 5) & 0xFF;
//len[i] = (length >>> 8 * (i - 1) + 5);
}
}
return Buffer.concat([ len, message ]);
}
}());
Der Unterschied zwischen 32/64-bit-Behandlung zwischen Java und Node.js soll wohl keine Probleme bereiten, auch das bit-shifting & co soll wie gewohnt in Java funktionieren.
Hat vielleicht jemand eine Idee, übersehe ich etwas?
-
18.01.2025, 15:19 #2
- Registriert seit
- 28.10.2011
- Beiträge
- 630
Thanked 281 Times in 169 PostsAW: Aktueller Huffman-Tree
Ich hab nun durch einige Änderungen ein besseres Ergebnis erzielt.
Hier ist der aktualisierte Code:
import Tree from '../../../Data/Tree.json' with { type: 'json' };
export default (new class Huffman {
constructor() {
this.compressedData = "\\\\\\";
this.buffer = Tree;
this.totalBytesProcessed = 0;
this.totalBytesWritten = 0;
this.finished = false;
this.rawData = undefined;
this.readIndex = 0;
this.writeIndex = 0;
}
decompress(buffer) {
if (typeof (buffer) === 'undefined' || buffer === null) {
return null;
}
let uncompressed = [];
this.rawData = buffer;
this.readIndex = 0;
this.writeIndex = 0;
this.finished = false;
let ast = this.buffer;
while (true) {
if (this.finished) {
let result = uncompressed.join('');
this.totalBytesWritten += result.length;
this.totalBytesProcessed += buffer.length;
return result;
}
try {
ast = ast[this.getBitValue()];
if (ast[0] == null) {
if (ast[1] != this.compressedData) {
uncompressed.push(ast[1]);
} else {
let code = 0;
for (let index = 0; index < 16; index++) {
code |= this.getBitValue() << index;
}
uncompressed.push(String.fromCharCode(code));
}
ast = this.buffer; // Reset AST after finding a leaf
}
} catch (e) { }
}
}
getBitValue() {
if (!this.rawData || this.writeIndex >= this.rawData.length) {
this.finished = true;
return 0;
}
let result = (this.rawData[this.writeIndex] >> this.readIndex) & 1;
this.readIndex++;
if (this.readIndex > 7) {
this.writeIndex++;
this.readIndex = 0;
this.finished = (this.writeIndex === this.rawData.length);
}
return result;
}
}());
Es scheint aber immer noch an einigen Ecken zu hapern:
-
21.01.2025, 01:48 #3
- Registriert seit
- 17.12.2011
- Beiträge
- 143
Thanked 73 Times in 52 PostsAW: Aktueller Huffman-Tree
Ist das überhaupt noch notwendig? Warum nicht einfach direkt im Browser manipulieren (zum Beispiel per Userscript)? Wenn es sowieso auf dem PC ausgeführt werden muss, könnte man doch direkt den Browser-Tab offen lassen, den Token mitnehmen und über GraphQL kommunizieren oder geht es bei deinem Beispiel eher um einen Lernzweck?
Per Userscript hast du halt auch viele Vorteile: Du kannst es plattformunabhängig nutzen, auch mobil über die Stay Safari-Erweiterung für iOS oder den Kiwi Browser mit Userscript-Erweiterung unter Android. So müsstest du dich gar nicht so tief mit dem Protokoll beschäftigen. Kannst halt direkt den DOM manipulieren und direkt auf beispielsweise HTML Elemente zugreifen bzw diese modifizieren
-
07.02.2025, 10:12 #4
- Registriert seit
- 28.10.2011
- Beiträge
- 630
Thanked 281 Times in 169 PostsAW: Aktueller Huffman-Tree
Es geht hier ausschließlich um die Java-Version.
Über K3 mit GraphQL gibt es weder alle Chatbefehle, noch wurden alle Features implementiert (typisch Knuddels). Die Java-Version ist demnach viel umfangreicher und für so einige Zwecke besser geeignet.
-
28.02.2025, 02:48 #5
AW: Aktueller Huffman-Tree
Moin,
ich verfolge deine Projekte immer gerne auf github, da ich einen ähnlichen Plan hatte und habe.
Den Huffmantree hab ich auch vor Monaten mal aus der StApp gezogen, hat auch funktioniert gehabt. Keine Ahnung ob und wie stark er sich geändert hat
-
28.02.2025, 10:26 #6
- Registriert seit
- 28.10.2011
- Beiträge
- 630
Thanked 281 Times in 169 PostsAW: Aktueller Huffman-Tree
Ich könnte bei Gelegengeit die Sachen auf GitHub mal öffentlich stellen, das ganze sollte sowieso irgendwann OpenSource sein.
Ich hab diverse Bot-Ansätze bereits umgesetzt, das sind alles aber teilweise schlecht funktionierende Skeletons (auch in verschiedenen Programmiersprachen).
-
01.03.2025, 03:34 #7
AW: Aktueller Huffman-Tree
Ich hab vor ca. eineinhalb Jahren in Java ne Library gebastelt, die die GraphQL API von Knuddels nutzt und sich mit dem Websocket verbindet um Nachrichten zu verarbeiten. Mit der StApp hab ich bisher noch keinen richtigen Erfolg gehabt.
Würde mich auf jeden Fall interessieren, welche Ansätze du sonst noch verfolgt hast. Wenn Interesse deinerseits besteht, könnte man sich ja auch mal zusammensetzen?
-
13.03.2025, 21:20 #8
- Registriert seit
- 28.10.2011
- Beiträge
- 630
Thanked 281 Times in 169 PostsAW: Aktueller Huffman-Tree
Ich hab mal zwei Ansätze für K3 hochgeladen:
https://github.com/Bizarrus/K3-Bot
Das eine ist eine Browser-Extension, was sich nur im Netzwerk zwischenhängen soll und das andere ein Standalone-Clienten.
Der Standalone-Client hat schon einige Features eingebaut, die ziemlich nice sind, steht aber auch in der Readme:
Features
Automatic response to ping-Events
Subscriptionable Events
Automatic Session-Renewing
Automatic Keep-Online Events
Full GraphQL fragments, querys, enums, subscriptions & mutations (See Protocol)
Implemented Bots
StayOnline (sends each 4 Minutes a random Text)
DailyLogin (automatically collects the daily login)
QuestSolver (automatically solve quests)
Hier ist noch das Proxy-Projekt, wo ich Probleme mit dem Huffman habe:
https://github.com/Bizarrus/KnoxyGeändert von Bubble Gum (Gestern um 09:16 Uhr)
Ähnliche Themen
-
[C#] Huffman
Von SeBi im Forum SourcecodeAntworten: 8Letzter Beitrag: 27.05.2020, 11:19 -
[C#] Huffman
Von Brainy im Forum SourcecodeAntworten: 2Letzter Beitrag: 27.05.2020, 09:59 -
[Release] Huffman (Java Library)
Von Flav im Forum ProtokollAntworten: 2Letzter Beitrag: 05.07.2013, 15:17 -
Module Tree Viewer Tool - Wer war des? oÔ
Von Bubble Gum im Forum RessourcenAntworten: 8Letzter Beitrag: 20.05.2013, 15:41 -
[Java] Huffman
Von Flav im Forum SourcecodeAntworten: 2Letzter Beitrag: 14.04.2012, 10:27
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.