利用Kotlin扩展函数实现MODBUS协议CRC16生成和校验

利⽤Kotlin扩展函数实现MODBUS协议CRC16⽣成和校验
获取MODBUS协议CRC16指令,
只要拼接好命令,byte数组或者int后.crc16()就返回⼀个byte数组.
验证⽤byte数组直接.crc16Verify()
使⽤⽅式
新建⼀个kt,复制下⾯的进去
import java.lang.RuntimeException
const val BITS_OF_BYTE =8
const val POLYNOMIAL =0xA001
const val INITIAL_VALUE =0xFFFF
const val FF  =0xFF
宝能收购万科
16(): ByteArray{
var res = INITIAL_VALUE
for(data in this){
res = res Int()and FF)
for(i in0 until BITS_OF_BYTE){
res =if(res and0x0001==1) res shr1xor POLYNOMIAL else res shr1
}
}
val lowByte: Byte =(res  shr8and FF).toByte()
val highByte: Byte =(res and FF).toByte()
return this.plus(highByte).plus(lowByte)
欲速则不达教学设计
}
16(): ByteArray{长白山日报电子版
val byteArray =ByteArray(this.size+2)
var res = INITIAL_VALUE
for(index in this.indices){
res = res xor this[index]
byteArray[index]=this[index].toByte()
for(i in0 until BITS_OF_BYTE){
res =if(res and0x0001==1) res shr1xor POLYNOMIAL else res shr1
}
}
val lowByte: Byte =(res  shr8and FF).toByte()
化学价
val highByte: Byte =(res and FF).toByte()
byteArray[this.size]= highByte
byteArray[this.size +1]= lowByte
return byteArray
}
拉面粉
16Verify(): Boolean{
if(this.size <3)throw RuntimeException("数组长度不合法")
var res = INITIAL_VALUE
for(his.size-3){
res = res xor(this[index].toInt()and FF)
for(i in0 until BITS_OF_BYTE){
res =if(res and0x0001==1) res shr1xor POLYNOMIAL else res shr1
}
}
val lowByte: Byte =(res  shr8and FF).toByte()
val highByte: Byte =(res and FF).toByte()
return highByte ==this[this.size -2]&& lowByte ==this[this.size -1]
}
验证
@Test
fun testCPC16(){
val data: ByteArray =byteArrayOf(0x01,0x06,0x00,0x47,Byte())
val data2 =intArrayOf(0x01,0x06,0x00,0x47,0x09,0xC4)
println(Crc16Util.16()))
println(Crc16Util.16()))
val data3 =byteArrayOf(0x01,0x06,0x00,0x47,Byte(),0x3e,0x1c)
16Verify())
}
20201/08/29
⾃⼰封装了⼀个android串⼝通信,协议配置从java层带⼊c++层后,c++返回处理完所有返回⼀个整帧数据。所以校验就在c++层了。附C++,CRC16代码:
inline
bool crc16(const unsigned char*array,int len,int checkRes){
文学社会学int crc =0xFFFF;
for(int i =0; i < len; i++){
crc ^= array[i];
for(int j =0;j <8; j++){
if(crc &0x0001){
crc =(crc >>1)^0xA001;
}else{
crc >>=1;
}
}
}
return(crc &0xFFFF)== checkRes;
}
kotlin层修改了最后return部分,kotlin的plus调⽤的深copy(py最后是调的native内存copy,具体性能看c++层怎么去调⽤malloc函数和运⽓),2次plus对性能消耗不如直接再静态分配⼀次。所以修改为:
return byteArrayOf(*this,highByte,lowByte)

本文发布于:2024-09-22 09:39:17,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/230866.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:协议   数组   返回
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议