问题描述
将接收到的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 (将#修改为@)