2016-07-20 19 views
0

Ich arbeite gerade an einem kleinen Programm, das Text komprimiert, indem wiederholte Wörter/Phrasen durch einen Verweis auf das nächste Vorkommen ersetzt werden - also eine Zeichenkette in eine kürzere Zeichenkette ohne Metadaten oder Arrays oder irgendwelche Techniken, die bei der echten Komprimierung verwendet werden. Meine Referenzen sind als Paare von Zeichen in einem gewissen Sinn wie folgt gespeichert:Können einige ASCII-Zeichen jeden String/Array/Stream in Java unterbrechen/beenden?

(char)7 + (char)(length << 4 + offset) 

wo (char)7 zum Signalisieren eines komprimierten Referenz nur ein willkürlicher ausgewählt char ist. Sowohl die Länge als auch der Versatz sind vollständige Werte byte Variablen, die sich auf die Anzahl der Wörter beziehen, die ersetzt werden, und den Offset bis zum nächsten Auftreten. (I'ts nicht relevant für die Frage, aber ich bin sie als unsigned Bytes durch manuelle unsigned < Behandlung -> unterzeichnet Konvertierung.)

//Example compression would result like this: 
String input = "compression and compression"; 
String output = (char)7 + (char)18 + " and compression" 
//(char)18 - binary 0001 0010 would be saying 1 word repeat, from 2 words ahead. 

TL; DR:, ich habe Angst, dass Es kann spezielle Situationen geben, in denen mein benutzerdefiniertes Zeichen als spezielles ASCII-Zeichen interpretiert werden kann. Ich bin mir bewusst, dass Strings in Java \0 Zeichen ignoriert (Due to this question). Aber gibt es andere Java-Methoden/Klassen, die Probleme verursachen könnten? Angenommen, ich würde die komprimierte Zeichenfolge mit Dingen wie Streams, Puffern, Lesegeräten, Char-Arrays usw. senden/konvertieren?

Antwort

1

String Unicode-Zeichen hält, genannt Codepunkte und char hat 2 Bytes und ist in UTF-16, ein spezielles Format. Insbesondere gibt es Ersatzpaare von 2 Zeichen, die Codepunkte über dem 2-Byte-Bereich darstellen, über 2 .

Alternativ zur Verwendung char könnten Sie alle in Codepunkten tun, die in Java vom Typ int sind. Es gibt jedoch eine Obergrenze für legales Unicode.

Sie könnten jedoch mit Ihrer Kodierung durchkommen, solange Sie in einigen Kodierungen keine Konvertierung in Bytes vornehmen. Und , dass ist das eigentliche Problem.

Da es keine saubere Lösung gibt, könnten byte[], ByteArrayOutputStream oder ByteBuffer (mit putShort und so) sauberer sein.

+0

Meinst du, dass ich unbedingt vermeiden sollte, meine komprimierte Zeichenfolge in Bytes zu konvertieren? Wäre es besser, wenn ich die Ausgabe nie zu einer Zeichenkette machen würde und stattdessen direkt ein Byte [] für die komprimierten Daten mache? – Chexxor

+1

Ja, auf diese Weise können Sie kurze Offsets (ein Byte), lange Offsets (zwei Bytes) und so weiter haben. Auch die Verwendung von Indizes im Array bytes. Sollte schöner aussehen. –

1

Es gibt keine Werte, die eine spezielle Bedeutung von "Unterbrechung" oder "Beendigung" einer Java-Zeichenfolge, eines Arrays oder eines Streams haben.

(Zumindest nicht, wenn Sie Ihre Anwendung entworfen haben, oder ein Protokoll oder eine Kodierung verwendet/ausgewählt haben, die eine bestimmte Bedeutung dieser Art auf bestimmte Werte legt. Ich kann mir nicht vorstellen, dass Sie ... getan haben, denn wenn Sie hatte getan, würden Sie diese Frage nicht fragen.)

+0

Ich sehe! Nein, ich habe nicht mein eigenes Protokoll/Encoder erstellt, aber ich habe gerade begonnen, etwas über Netzwerkprogrammierung zu lernen, und ich weiß nicht, wie ein anderer Computer einen eingehenden Bytestream interpretieren oder wie er diesen Stream wieder in einen konvertieren würde Zeichenfolge. – Chexxor