Kotlin: преобразовать двоичный входной поток в строку base64 в блоках/буферизованном виде?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Kotlin: преобразовать двоичный входной поток в строку base64 в блоках/буферизованном виде?

Сообщение Anonymous »

В настоящее время я пытаюсь прочитать данный входной поток как строку в кодировке Base64 в Kotlin. К сожалению, все приложение Android аварийно завершает работу с ошибкой недостаточно памяти, как только размер файла превышает 20 мегабайт. Мне нравится расширять это как минимум до 40 МБ.
Я думаю, мне нужно читать и преобразовывать байты потока в блоки типа 8 КБ для обработки, но я не могу найти ни одного примера Kotlin. о том, как это сделать, поскольку я не могу просто преобразовать блоки в base64 и объединить их. Это не работает для base64 из-за кодировки.
Я думаю, мне нужен какой-то поточный кодировщик base64, и я не могу найти для этого никакого решения, которое у меня работает. Код JAVA, который я могу найти здесь, в StackOverflow, я не могу преобразовать в Kotlin, поскольку я новичок в Kotlin и Java в целом :-(
Кроме того, я читаю двоичные файлы данные и не могу использовать ни одну функцию lineReader, которую я нахожу повсюду. Она должна работать с блоками заданного размера в байтах.
Это функция, которая используется в настоящее время. вылетает, если файл больше примерно 20 МБ:

Код: Выделить всё

private fun pushAttachmentToJS(uri: Uri) {
try {
val inputStream = contentResolver.openInputStream(uri)
inputStream.use { stream ->

// Next two lines need a replacement working in blocks
val fileBytes = stream?.readBytes()
val fB64 = Base64.encodeToString(fileBytes, Base64.NO_WRAP) // 

val encoder = Base64.getEncoder().withoutPadding()
val buffer = ByteArray(12000) // bytes buffer (multiple of 3!)
val builder = StringBuilder()

var bytesRead: Int
var lastSize = 0
while (true) {
bytesRead = stream!!.read(buffer)
if (bytesRead == -1) break
lastSize = bytesRead // remember to later get the padding

val chunk = buffer.copyOfRange(0, bytesRead)
val encodedChunk = encoder.encodeToString(chunk)

// Append the encoded chunk to the StringBuilder
builder.append(encodedChunk)
}

// Add necessary padding to the final string
val remainder = lastSize % 4
if (remainder != 0) {
val paddingNeeded = 4 - remainder
repeat(paddingNeeded) {
builder.append('=')
}
}

val fB64 = builder.toString()

// (... further processing of the fB64 string)
}
} catch (e: IOException) {
e.printStackTrace()
}
}
Но теперь строка в кодировке Base64 кажется неправильной. По крайней мере, это не работает так, как задумано. Завтра потребуется дальнейшая проверка...

Подробнее здесь: https://stackoverflow.com/questions/791 ... s-buffered
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»