通过选择文件时,onActivityResult()
我想将其“剪切”成碎片。为此,我读取了它的字节:
val fileUri = data.data!!
val string = fileUri.let { uri -> contentResolver.openInputStream(uri).use { it!!.readBytes() } }
我正在切片:
val partSize = 10000
val partsCount = if (size.rem(partSize).toInt() == 0) {
size.div(partSize).toInt()
} else {
size.div(partSize).toInt() + 1
}
for (i in 0 until partsCount) {
val slicedString: ByteArray = if ((i + 1) * partSize < i * partSize + size.rem(partSize).toInt()) {
string.slice(i * partSize..(i + 1) * partSize).toByteArray()
} else {
string.slice(i * partSize..i * partSize + size.rem(partSize).toInt()).toByteArray()
}
}
现在实际的问题是:文件大小127036
和我的应用程序因错误而崩溃:
java.lang.IndexOutOfBoundsException: toIndex (127037) is greater than size (127036)
问题是 - 又一个字节是从哪里来的,以及如何删除它?也许它是某种空间或需要移除的隐形字符trim()
?如果我们将通常的输出带到索引控制台进行切片,那么一切都很好:
if ((i + 1) * partSize < i * partSize + size.rem(partSize).toInt()) {
Timber.i((i * partSize..(i + 1) * partSize).toString())
} else {
Timber.i((i * partSize..i * partSize + size.rem(partSize).toInt()).toString())
}
我认为问题出在size.rem(partSize).toInt()
. 舍入失败,因为 long 已通过并且文档只有 double/int。还有一个想法是移位一位:
size.rem(partSize).shr(1).toInt()
但不确定这是否是正确的解决方案。
一个简单的测试可以准确地显示错误的位置。
slice
削减区间 FROM-TO 包括在内。因此,必须在计算 DO 边界时不要忘记字符串长度的值不是它的最后一个索引。以下代码对我来说似乎是正确的: