Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于串行通信的Java校验和计算_Java_Checksum - Fatal编程技术网

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

用于串行通信的Java校验和计算,java,checksum,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; i

我用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;
}
我不懂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的最后两位数字,非常奇怪的方式来进行校验和…

这是我的产品,这是VisualFoxPro是的,我知道

*!* 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))

如果s是字符串,则s.charAtn返回从0开始的第n个字符,即s.charAt0是第一个字符,s.charAt1是第二个字符,以此类推。s.substring0,1使用与s.charAt0相同的字符返回长度为1个字符的字符串。Eh和El基本上设置为2个字符的字符串,其第一个字符是“3”。分配给sumaStr的最后一行将其分配给前一个sumaStr的最后两个字符。我或多或少理解这一点。似乎添加字符会将字符的ascii十六进制值添加到suma中。我或多或少了解了正在做的事情,我认为他们正在以一种非常复杂的方式计算校验和:每个字符的十六进制值都被添加,包括第一个字符。例如,第一行是07+30+31+31=99,如果字符串较长且总和大于FF,则转换为3939,它们使用十六进制数的最后2个字符,并进行拆分和两个3的相加。很奇怪他们是如何计算的。对,在这种情况下,Java的字符类型被视为一个整数,因此字符“A”相当于整数65=0x41,等等。charAt给出每个字符的数值,而不是十六进制值。它是一个数字,不是字符串,是UTF-16BE值,而不是ASCII,尽管对于所有不是Unicode高半部或低半部代理的字符,它将与Unicode代码点相同,并且Latin-1是Unicode的子集,ASCII是Latin-1的子集。
*!* 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))