Ich versuche, eine UTF8-Zeichenfolge über einen java.nio.ByteBuffer zu lesen. Die Größe ist ein unsinged int, was natürlich Java nicht hat. Ich habe den Wert in eine lange gelesen, so dass ich den Wert habe.Lesen einer UTF-8-Zeichenfolge aus einem ByteBuffer, wobei die Länge ein unsigned int ist
Das nächste Problem, das ich habe, ist, dass ich nicht ein Array von Bytes mit dem langen erstellen kann, und Casting er lange zurück zu einem int wird dazu führen, dass es signiert wird.
Ich versuchte auch mit Limit() auf den Puffer, aber es funktioniert wieder mit Int nicht lange.
Das Besondere, was ich tue, liest die UTF8-Strings aus einer Klassendatei, so dass der Puffer mehr enthält als nur die UTF8-Zeichenfolge.
Irgendwelche Ideen zum Lesen eines UTF8-Strings, der eine mögliche Länge eines unsigned int von einem ByteBuffer hat.
EDIT:
Here is an example of the issue.
SourceDebugExtension_attribute {
u2 attribute_name_index;
u4 attribute_length;
u1 debug_extension[attribute_length];
}
attribute_name_index
The value of the attribute_name_index item must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Utf8_info structure representing the string "SourceDebugExtension".
attribute_length
The value of the attribute_length item indicates the length of the attribute, excluding the initial six bytes. The value of the attribute_length item is thus the number of bytes in the debug_extension[] item.
debug_extension[]
The debug_extension array holds a string, which must be in UTF-8 format. There is no terminating zero byte.
The string in the debug_extension item will be interpreted as extended debugging information. The content of this string has no semantic effect on the Java Virtual Machine.
also von einem technischen Standpunkt aus gesehen, ist es möglich, eine Zeichenfolge in der Klassendatei zu haben, die die volle u4 ist (ohne Vorzeichen, 4 Byte) in der Länge.
Dies ist kein Problem, wenn die Größe einer UTF8-Zeichenfolge begrenzt ist (ich bin kein UTF8-Experte, also gibt es vielleicht ein solches Limit).
Ich konnte einfach darauf Punt und mit der Realität gehen, dass es nicht geht, eine Zeichenfolge, die lange dauern, ...
Sicherlich kann das Array von Bytes länger sein, wenn die Kodierung> 1 Byte/Zeichen ist. String kapselt ein char [] -Array und kein byte [] -Array. –
sicher, es kann länger sein. Es wird aber niemals 2 GB erreichen. – Alnitak
sehe meine Bearbeitung ... die Größe ist überhaupt nicht unter meiner Kontrolle ... – TofuBeer