Ich schreibe gerade ein Java-Programm, das mit einer Chrome-Erweiterung kommuniziert. Ich muss das native Messaging-Protokoll von Chrome implementieren, um zu kommunizieren. Die Google Chrome-Dokumentation lautet:Java Native Messaging mit Chrome-Erweiterung - kann nicht korrekt schreiben Länge
... Jede Nachricht wird unter Verwendung von JSON, UTF-8-codiert serialisiert und hat eine 32-Bit-Nachrichtenlänge in nativer Byte-Reihenfolge. (Source)
Ich habe versucht, dies in Java zu implementieren, aber ich habe Probleme, wenn meine Nachrichten eine bestimmte Länge haben, obwohl meine Implementierung korrekt sein sollte. Hier ist meine aktuelle Implementierung, basierend auf früheren SO-Antworten & Fragen (here zum Beispiel):
// read the message size from Chrome. This part works correctly.
public static int getInt(char[] bytes) {
return (bytes[3]<<24) & 0xff000000|
(bytes[2]<<16) & 0x00ff0000|
(bytes[1]<< 8) & 0x0000ff00|
(bytes[0]<< 0) & 0x000000ff;
}
// transform the length into the 32-bit message length.
// This part works for small numbers, but does not work for length 2269 for example.
public static String getBytes(int length) {
return String.format("%c%c%c%c",
(char) (length & 0xFF),
(char) ((length>>8) & 0xFF),
(char) ((length>>16) & 0xFF),
(char) ((length>>24) & 0xFF));
}
Es scheint, das Problem in der Art und Weise liegt Java-Zeichen implementiert. Ich würde normale Zeichen wie in C erwarten. In der Praxis scheint es, dass Java diese Zeichen manchmal in Unicode-Zeichen umwandelt (zumindest ist das mein Verdacht). Dies wird in der folgenden Ausgabe reflektiert (Ausleiten xxd das tatsächliche Bytes zeigen) aus dem Java-Programm für Länge 2269:
0000000: c39d 0800 00 .....
Die erwartete Ausgabe jedoch (mit Python):
import struct
struct.pack('I', 2269)
# outputs in interactive mode: '\xdd\x08\x00\x00'
Was genau passiert hier? Warum konvertiert Java "0xDD" in "0xC39D" und wie kann ich meine getBytes
-Funktion dazu bringen, die erwartete Eingabe für Chrome Native Messaging darzustellen? Eine andere Sprache zu verwenden ist keine Option.
i verwendet, um Sie zu beantworten, aber es hat nicht work.i diesen Fehler in Ausfahrseite Native Anwendung versucht, eine Nachricht von 977.472.013 Bytes zu senden, die die Grenze überschreitet 1048576 Bytes. – Leon
Versuchen Sie, Ihre Anwendung manuell auszuführen und durch xxd zu leiten. Das sollte dich auf den richtigen Weg bringen, um herauszufinden, was falsch läuft. Wahrscheinlich geben Sie eine neue Zeile (\ r \ n) vor der eigentlichen Ausgabe aus. 'struct.pack ('I', 977472013)' -> '\ r \ nC: ''. Eine korrekte Nachricht sendet zuerst die Länge und dann den tatsächlichen Inhalt. – Snicksie