在Android [Kotlin或Java]中使用wifi设备[MCU设备]和数据报套接字将字符串转换为字节数组,反之亦然

问题描述

将接收到的BytesArray转换为String时遇到问题,因为它正确返回了Text数据,但给了其他字符作为替换字符“”。

1。 DatagramSocket类

/**
 * Connect and request to the server
 * @param requestCode : [Setting]
 * @param listener : Return callback with success status [Boolean] and [MasterModel]
 * @Ext MasterModel : Model class having all the datas
 */
private fun MasterModel.startReceiving(
    requestCode: String = Setting.informationTC.value,listener: (Boolean,MasterModel) -> Unit
) {
    //device config
    val deviceIp: InetAddress = InetAddress.getByName(Setting.DeviceIp.value) // ip of the mcu device
    val devicePort = Setting.DevicePort.value.makeInt() // port number of mcu device

    //init dataGram
    val dGram = DatagramSocket(null)
    //get buffer
    val buffer = getBuffer(requestCode)
    runBackground {
        //load data
        try {

            //create packet
            dGram.apply {
                //set flags
                reuseAddress = true
                broadcast = true
                soTimeout = timeout // 3 seconds

                //bind
                bind(InetSocketAddress(devicePort))
                //re-connect every time
                connect(
                    InetAddress.getByName(Setting.DeviceIp.value),Setting.DevicePort.value.makeInt()
                )

                //init packet
                var dp = DatagramPacket(buffer,buffer.size,deviceIp,devicePort)

                //data sent
                send(dp)
                Log.d("Data in socket : Send data successfully.")

                //update packet
                val newBuffer = ByteArray(receiveBufferSize)
                dp = DatagramPacket(newBuffer,newBuffer.size)

                //data received
                receive(dp)
                val data = dp.data.makeString()
                Log.d("Data from socket : $data")
                Log.d("Receive Buffer Size : ${receiveBufferSize / 1024} MB")

                //send callback after initializing the data in masterModel class
                listener.invoke(dp.data.isNotEmpty(),initialize(data,requestCode))

                //close old one
                close()
            }
        } catch (e: Exception) {
            //close datagram socket
            dGram.close()
            //print error
            Log.d("Error Receiving in Data Gram :  ${e.message}")
            //send false callback to main thread
            listener.invoke(false,this)
        }
    }
}

在将byteArray中的数据发送到数据报之后,它返回byteArray类型的Data,但是在那之后,如果我使用String(byteArray,0,byteArray.size,Charsets.UTF_8)进行转换,它仍然会给出带有替换字符的数据

2。扩展程序类

/**
 * Make any data type into [String] data type
 */
fun Any?.makeString(default: String = ""): String {
    return when (this) {
        null -> default
        is String -> this.trim()
        is ByteArray -> decodetoString() // kotlin in-build method to decode string
        else -> this.toString()
    }
}

3。获取编码的Buffer(ByteArray)

/**
 * Get buffer [ByteArray] using request string according to the given [requestCode]
 * @param requestCode : [String]
 */
private fun MasterModel.getBuffer(requestCode: String): ByteArray {
    val sb = StringBuilder()
    //request with key value
    when (requestCode) {
        Setting.informationTC.value -> {
            //basic request
            sb.append(Setting.UnlockCode.value)
                .append(Setting.Separator.value)
                .append(Setting.informationTC.value)
        }
       
    }
    Log.d("Request Link : $sb")
    return sb.toString().encodetoByteArray() // kotlin in-build method to encode string
}

4。输入

{解锁代码} {分隔符} {单位计量请求交易代码} 例如:jasghkug Space 1234 //将SPACE视为实际空间

5。

104207194088测试4304 GG2641 $ GK23000023R00P08TESTINGG104207194088 201029050709BVodafone IN������������ l(声明��������������������������������������������������������f ������第一������������T�������第二������������U�������第三 ������������������������������������������������������5 ��������������X�����Six��

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)