【问题标题】:kotlin Converts bytearray to String data crashkotlin 将 bytearray 转换为 String 数据崩溃
【发布时间】:2021-01-14 03:00:42
【问题描述】:

将通过通信接收到的字节数组数据转换为字符串。

如果字节数组很长(例如 355),则结尾被截断。

utf-8、utf-16 等也是如此。

fun getString(content:ByteArray, length: Int): String? {
    var str: String? = null

    try {
        str = String(content, 0, length, Charset.forName("euc-kr"))
        i("Test::getString str : " + str)
    } catch (e: java.lang.Exception) {
        i("Test::getString ERR ")
        error("Charset exception", DlgAprList::class.java)
    }
    return str
}

超过 355 字节时发生,如果您查看附加链接的图像,它是 389 字节,您可以看到发生了截断。

在其他函数中,像这样使用getString函数。

var str : String? = getString(data, data.size)
var info: Array<String> = str!!.split(";").toTypedArray()
for (i in 0 until info.size - 1) {
                var temp = info[i].split("-".toRegex()).toTypedArray()
                var name = temp[0]
                var desc = temp[1]
                var final = name +"-"+ desc
                var finalresult : DlgAprInfo = DlgAprInfo(name,desc)
                i("Test::parseAndReplace temp size : " + info.size + " temp " + i +" : " + finalresult.name + "-"+ finalresult.desc)
                //listnew.add(final)
                list.add(finalresult) // testver
            }

我已经附上了第一个接收点的代码

_networkReader = BufferedInputStream(BufferedInputStream(_socket!!.getInputStream()))
                                        var bytesRead = _networkReader!!.read(buffer, 0, Companion.BUFFER_LEN)
if (bytesRead >= 0) {
   if (!_connect) NotifyConnect()
    var command = buffer[4]
    var content: ByteArray? = null
    var length : Int = 0
    var index = 0
    while (index + 3 < bytesRead) {
       var contentlength: Int = ((buffer[index] and 0xff.toByte()).toInt() shl 24) + ((buffer[index + 1] and 0xff.toByte()).toInt() shl 16) + ((buffer[index + 2] and 0xff.toByte()).toInt() shl 8) + ((buffer[index + 3] and 0xff.toByte()).toInt() shl 0)
      var cmd = buffer[index + 4]
      if (bytesRead > Companion.COMMAND_LEN) {
         content = ByteArray(bytesRead - index - Companion.COMMAND_LEN - 4)
         length = content.size
         System.arraycopy(buffer, index + 5, content, 0, contentlength)
     }
  processPacket(cmd, content, contentlength)
  }
}

处理包函数

private fun processPacket(command: Byte, content: ByteArray?, length: Int) {
            try {
                if (content != null) {
                    LogUtil.i("StandElin 1-1 " + "Command 0x" + Integer.toHexString(command.toInt()) + " "
                            + String(content, 0, length, CHARSET))
                } else {
                    LogUtil.i("StandElin 1-2" + "Command 0x" + Integer.toHexString(command.toInt()))
                }
                LogUtil.i("StandElin 2 FinalCommand : 0x" + Integer.toHexString(command.toInt()))
                var message: Message? = null
                var parsed: Any? = null

DlgAprList.instance?.parseAndReplace(content)

附在最上面的第一个代码是一个包含在DlgAprList类中的函数

【问题讨论】:

  • 你之前问过这个。用同样的话。发生了什么?
  • 长度的值是多少?它应该是 content.size 并且不需要将它作为单独的参数传递给您的第一个方法。
  • 对。长度的值是 contet.size。为使用 get string 的其他函数的内容添加了一些源代码。
  • @blackapps 没有任何进展,我发了一篇新文章,因为我想解决这个问题。
  • 请贴出初始化字节数组的代码并展示如何调用该函数。还要告诉字节数组中的内容是什么,即使您没有告诉,也无法将所有字节值转换为字符串。

标签: java android kotlin


【解决方案1】:

我创建了一个存储库,您可以通过测试运行您的用例:GitHub

有几个可能的问题:

  • Log.i会不会有什么麻烦?
  • 检查您编码时使用的初始编码:
val str = "My long string"
val byteArray = str.toByteArray(Charset.forName("utf-8"))

  • 检查您解码时使用的编码。在您的代码中,我看到 euc-kr 编码是硬编码的。这意味着如果您使用 utf-8 编码并使用不同的解码,则代码将失败。

【讨论】:

  • @drogba 作为后端开发人员,我创建了一个后端服务。如果您可以发布一个最小的 Android 版本来重现您的问题,我可以调试它。
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多