Schnell ByteBuffer zu CharBuffer oder char[]
Was ist die Schnellste Methode zum konvertieren von java.nio.ByteBuffer a
in eine (neu erstellte) CharBuffer b
oder char[] b
.
Dadurch ist es wichtig, dass a[i] == b[i]
. Das bedeutet, dass nicht a[i]
und a[i+1]
zusammen ein Wert b[j]
, was getChar(i)
tun würde, aber die Werte sollten als "spread".
byte a[] = { 1,2,3, 125,126,127, -128,-127,-126 } //each a byte (which are signed)
char b[] = { 1,2,3, 125,126,127, 128, 129, 130 } //each a char (which are unsigned)
Beachten Sie, dass byte:-128
hat die gleichen (unteren 8) bits als char:128
. Daher nehme ich an, das "beste" interpretation wäre so, als bemerkte ich es vor, denn die bits sind die gleichen.
Danach benötige ich auch die Umgekehrt übersetzung: Der effizienteste Weg, um einen char[]
oder java.nio.CharBuffer
wieder in eine java.nio.ByteBuffer
.
Was willst du mit diesem char Puffer? Was soll geschehen, wenn Sie in eine 2-byte-char? Wie sollten die übersetzten byte-array dann so Aussehen? Je nachdem, was Sie benötigen, den effizientesten Weg könnte sein, die nicht konvertiert werden.
In anderen Worten, suchen Sie interpretieren den Inhalt der
Die Annahme ist, es gibt keinen höheren Wert als
Huh? Wenn Sie Bild - /Bild-Daten, warum dann kümmern Sie sich um Figuren? Vielleicht, wenn Sie beschrieben, was Sie versuchen zu erreichen, anstatt Ihre gewünschten Ansatz zu vollbringen, würden Sie bekommen mehr relevante Antworten.
dann die Daten geben, die Sie brauchen, heißt
In anderen Worten, suchen Sie interpretieren den Inhalt der
ByteBuffer
als eine Folge von Zeichen kodiert ISO-8859-1?Die Annahme ist, es gibt keinen höheren Wert als
0xff
im char[]
Puffer für Rückseite-übersetzung. Jedes Verhalten/Abstürzen würde in Ordnung sein ("unspecified"). ISO-8859-1? Soweit ich weiß, es sind bytes, die nicht übersetzt werden kann, indem jede codepage (zB \0
)? Ich denke, die vielen codepage-Konvertierung Bibliotheken nehmen Sie es nicht schön, wenn Sie werfen eine 8-bit-Datenstrom. Aber ich weiß nicht, über Java, ich werde es nachschlagen. Vorstellen, ich habe Bild - /Bild-Daten.Huh? Wenn Sie Bild - /Bild-Daten, warum dann kümmern Sie sich um Figuren? Vielleicht, wenn Sie beschrieben, was Sie versuchen zu erreichen, anstatt Ihre gewünschten Ansatz zu vollbringen, würden Sie bekommen mehr relevante Antworten.
dann die Daten geben, die Sie brauchen, heißt
short
InformationsquelleAutor towi | 2011-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, was Sie wollen, ist zu konvertieren mit der Kodierung ISO-8859-1.
Ich nicht behaupten, dass alles über Effizienz, aber zumindest ist es Recht kurz zu schreiben:
Die andere Richtung wäre:
Bitte Messen Sie diese vor anderen Lösungen. (Um fair zu sein, die
Charset.forName
Teil sollte nicht aufgenommen werden, und sollte auch nur einmal gemacht werden, nicht für jeden Puffer wieder.)Ab Java 7 gibt es auch das StandardCharsets - Klasse mit pre-instanziiert-Charset-Instanzen verwenden, so können Sie
und
statt. (Diese Zeilen tun das gleiche wie vorher, nur das nachschlagen ist einfacher und es besteht keine Gefahr, sich versehentlich bei der Eingabe die Namen und keine Notwendigkeit, fangen die Ausnahmen unmöglich.)
Danke für den Hinweis, ich aktualisierte die Antwort.
InformationsquelleAutor Paŭlo Ebermann
Stimme ich mit @Ishtar, schlagen zu vermeiden, die Umstellung auf eine neue Struktur und nur konvertieren, wie Sie es brauchen.
Aber wenn man ein Haufen ByteBuffer, die Sie tun können.
Sie können sicher sein, dass die Codierung funktioniert, wie Sie wollen. Sie könnten versuchen, "US-ASCII" aber ich weiß nicht, es funktioniert für alle von 0 - 255.
Nein, US-ASCII ist nur für 0-127, andere bytes, die gemappt werden (in Java, wenn Sie nicht mit dem CharSet-API für eine feinere Kontrolle)
'?'
andere chars zu(byte)'?'
. Verwenden Sie ISO-8859-1 für die vollständige Abdeckung des 8-bit-Bereich, d.h. das zu tun, was deine Schleife macht.InformationsquelleAutor Peter Lawrey
Abgesehen von der Vertagung der Schaffung von CharBuffer, können Sie in der Lage, durch zu bekommen, ohne eine.
Wenn Sie code, verwenden die Daten als Zeichen nicht unbedingt brauchen, ein CharBuffer oder char[], führen einfach on-the-fly-Konvertierung; ByteBuffer verwenden.get() (relative oder absolute), convert to char (Hinweis: wie schon, Sie MÜSSEN leider ausdrücklich Maske Sachen; ansonsten Werte 128-255 werden Vorzeichen erweitert, um falsche Werte, 0xFF80 - 0xFFFF; nicht notwendig bei der 7-bit-ASCII) und verwenden Sie diese.
InformationsquelleAutor StaxMan