Я пытаюсь прочитать строку UTF8 через java.nio.ByteBuffer. Размер - это неизменяемый int, который, конечно, Java не имеет. Я прочитал значение в длинном, так что у меня есть значение.Чтение строки UTF-8 из ByteBuffer, где length is unsigned int
Следующий вопрос, который у меня есть, заключается в том, что я не могу создать массив байтов с длинным, и отбрасывание его назад к int приведет к его подписанию.
Я также попытался использовать limit() в буфере, но снова он работает с int не долго.
Конкретная вещь, которую я делаю, это чтение строк UTF8 из файла класса, поэтому в буфере есть больше, чем только строка UTF8.
Любые идеи о том, как читать строку UTF8, которая имеет потенциальную длину неподписанного int из ByteBuffer.
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.
Таким образом, с технической точки зрения, можно иметь строку в файле класса, который является полным u4 (без знака, 4 байта) в длину.
Это не будет проблемой, если существует ограничение на размер строки UTF8 (я не эксперт UTF8, поэтому, возможно, существует такой предел).
я мог бы просто выбивать на него и с реальностью, что не собирается быть строка, которая долго ...
Несомненно, массив байтов может быть длиннее в случае, когда кодировка составляет> 1 байт/символ. String инкапсулирует массив char [], а не массив byte []. –
уверен, он может быть длиннее. Это никогда не ударит по 2 ГБ. – Alnitak
см. Мое редактирование ... размер не находится под моим контролем вообще ... – TofuBeer