安卓CRC16校验中遇到的问题和解决方案

本文介绍了在安卓应用中实现CRC16校验的过程,针对将十进制指令转换为十六进制并计算校验位的场景进行讨论。在业务需求下,需要将101(一区一号桌)等十进制数字转化为十六进制byte[],通过CRC校验确保指令的正确性,并最终发送给下位机执行。
摘要由CSDN通过智能技术生成

业务场景:在安卓端做一个上位机,发送指令给下位机去执行。送餐机器人要发送去几区几号桌送餐,由于下位机是其他公司的,而且只接受十六进制的指令,所以只能通过上位机转化为byte[]然后发送给下位机。

解决思路:几区几号桌是十进制的数字,101(一区一号桌),102(一区2号桌)..999(9区99号桌)

 十进制--> 十六进制-> byte[] -->计算出校验位 ->拼接byte[] 十六进制指令发送


//函数说明,根据十进制数字,获取发送到几桌几号的指令

private byte[]  getdeskcommand(int int_desknum) {
    byte[] buf_1 ={(byte)0x1B,(byte)0x00,(byte)0x0C,(byte)0x04},//命令头
            buf_2={(byte)0x00,(byte)0x00,(byte)0x02,(byte)0xFF},//数据内容
            buf_3={(byte)0xFF,(byte)0xFF},//校验位
            buf_4={(byte)0x05};//结束标识
    byte[] hb = new byte[2];
    hb = Integer.toHexString(int_desknum).getBytes();//将十进制数转化为十六进制数,再转为byte[]
    String s = new String(hb);
    if(s.length()>2){
        String s1 = s.substring(s.length()-1,s.length());
        String s2 = s.substring(0,s.length()-1);
        buf_2[1] = Byte.decode("0x"+s1);//用系统的方法转化后的结果没有0x,需要加上
        buf_2[0] = Byte.decode("0x"+s2);
    }else{
        buf_2[1] = Byte.decode("0x"+s);
    }
    buf_3 = setParaCRC(buf_2);//根据数据位计算校验位
    byte[] sum = sumbyte(sumbyte(sumbyte(buf_1,buf_2),buf_3),buf_4);
    return sum;
}
private byte[] sumbyte(byte[] b1,byte[] b2)//拼接byte[]
{
    byte[] sum = new byte[b1.length+b2.length];
    for(int i = 0;i<b1.length;i++){
        sum[i] = b1[i];
    }
    for(int i=0;i<b2.length;i++){
        sum[b1.length+i] = b2[i];
    }
    return sum;
}
 
 
//CRC校验CRC-16/USB
public byte[] setParaCRC(byte[] buf){
    //int MASK = 0x0001,CRCSEED = 0xa001;
    int MASK = 0x0001,CRCSEED = 0xa001
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值