【发布时间】: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 没有任何进展,我发了一篇新文章,因为我想解决这个问题。
-
请贴出初始化字节数组的代码并展示如何调用该函数。还要告诉字节数组中的内容是什么,即使您没有告诉,也无法将所有字节值转换为字符串。