Java NMEA校验和计算

Java NMEA校验和计算,java,gps,checksum,nmea,Java,Gps,Checksum,Nmea,我对计算NMEA句子的校验和有问题。我正在使用以下java代码: private static String getSum(String in) { int checksum = 0; if (in.startsWith("$")) { in = in.substring(1, in.length()); } int end = in.indexOf('*'); if (end == -1) end = in.length

我对计算NMEA句子的校验和有问题。我正在使用以下java代码:

private static String getSum(String in) {
    int checksum = 0;
    if (in.startsWith("$")) {
        in = in.substring(1, in.length());
    }

    int end = in.indexOf('*');
    if (end == -1)
        end = in.length();
    for (int i = 0; i < end; i++) {
        checksum = checksum ^ in.charAt(i);
    }
    String hex = Integer.toHexString(checksum);
    if (hex.length() == 1)
        hex = "0" + hex;
    return hex.toUpperCase();
}
私有静态字符串getSum(字符串输入){
整数校验和=0;
如果(以“$”开头){
in=in.substring(1,in.length());
}
int end=in.indexOf('*');
如果(结束==-1)
结束=英寸长度();
for(int i=0;i
这段代码类似于互联网上的许多其他示例,在我尝试这样一句话之前,一切都很好

$PSRF101,-2686700,-43042003851624960004997260921,12,3*1C

这句话来自,所以我假设校验和是正确的。但当我计算它时,我得到的是*2F作为校验和,而不是1C


我认为这是因为句子中的负面价值,但我不知道如何处理它们。有人有什么建议吗?

假设和计算的校验和之差等于省略 (或具有额外字符“3”); 所以我很容易相信NMEA参考手册中的错误

您可以尝试一些在线NMEA计算器来验证结果。

e、 g.

符号
-
没有区别:校验和仍然是
2F
不正确,每个字符都有贡献。但是,如果删除了两个破折号,则实际上要执行两次XORing。。。让你回到原来的位置。删除一个或另一个绝对会改变结果。Sirf手册还至少有一个错误的命令“$GPMSK,318.0,A,100,M,2,*45”,它有一个额外的commaSo,这可能是手册的错误?因为“$PSRF104,37.3875111,-121.97232,0960002377591946,12,1*07”也将是错误的,我从我的代码和在线计算器中得到一个“*06”,手册上说“*07”。这里又是负值,所以我认为这可能是错误的。06和07之间的误差只是十六进制的01。这表明某些字符(可能是最后一个字符)应该是0而不是1。然后校验和将匹配。“-”符号似乎不会导致错误。