用于串行通信的Java校验和计算

时间:2014-08-07 16:35:14

标签: java checksum

我在Java中有这个代码:

public static synchronized String generarCheckSum(int campoInicio, String comando, boolean tieneCheckSum)
{
    String checkSum = "";
    int leerHasta = 1;
    if(tieneCheckSum)
        leerHasta = 3;
    int suma = campoInicio;
    int idxInicio = 0;
    try
    {
        if(!es3600(comando))
        {
            idxInicio = 1;
            for(int i = 0; i < TIPO_EQUIPO.length; i++)
                if(TIPO_EQUIPO[i].equals(comando.substring(0, 1)))
                    suma = suma + 65 + i;

        }
        for(int i = idxInicio; i <= comando.length() - leerHasta; i++)
        {
            if(comando.charAt(i) == '\n')
                continue;
            if(comando.charAt(i) == '\u20AC')
                suma += 128;
            else
                suma += comando.charAt(i);
        }

        String sumaStr = Integer.toHexString(suma);
        sumaStr = sumaStr.substring(sumaStr.length() - 2, sumaStr.length());
        String Eh = (new StringBuilder()).append("3").append(sumaStr.charAt(0)).toString();
        String El = (new StringBuilder()).append("3").append(sumaStr.charAt(1)).toString();
        checkSum = (new StringBuilder()).append(UtlGeneral.convertirHexaToASCII(Eh)).append(UtlGeneral.convertirHexaToASCII(El)).toString();
    }
    catch(Exception e)
    {
        return null;
    }
    return checkSum;
}

例如,它被称为:

chk = generarCheckSum(2, comando, false)

我不懂Java,所以我很难理解代码的作用。根据我的理解,它是从字符串计算两个字节的校验和。

我有十六进制的字符串示例:

07303131393904
07303232393B04
07303332393C04
073235323A3004

在这一行中,唯一改变的是设备号:01,02,03和25

我猜第一个和最后一个字节是分隔符:07和04,而3939,393B,393C和3A30是计算的校验和。

在我的情况下,es3600检查返回TRUE,因为该设备是3600型号。

校验和计算的算法是什么?

编辑:更多信息。

在另一个样本中:

02 30 33 33 34 30 33 30 32 30 31 30 34 30 35 30 36 32 31 04

添加所有数字= 321(十六进制),结果是32 31(仅使用321的最后两位数字)非常奇怪的方式来进行校验和...

1 个答案:

答案 0 :(得分:0)

这就是我的意思(这是Visual FoxPro)(是的,我知道)

*!* GENERARCHECKSUM

Lparameters pString

Local checksum, lnx

m.checksum = 0

For m.lnx = 1 To Len(m.pString)
    m.checksum = m.checksum + Asc(Substr(m.pString, m.lnx, 1))
Endfor

Return Chr(0x30 + Bitrshift(Bitand(m.checksum, 0xf0), 4)) + Chr(0x30 + Bitand(m.checksum, 0x0f))