CheckSum 8 Xor 错误结果

Posted

技术标签:

【中文标题】CheckSum 8 Xor 错误结果【英文标题】:CheckSum 8 Xor wrong result 【发布时间】:2016-08-02 18:03:04 【问题描述】:

我正在尝试创建“CheckSum 8 Xor”

这是我目前的代码

String check = "00 02 01 03 c0 30 30 31 e1 c7 90 1c 44 54 61 6e 79 61 20 20 20 20 20 20 20 20 20 20 20 1c 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 04";

 int getCheckSum(String check)

    byte[] chars = check.getBytes();
    int XOR = 0;
    for (int i = 0; i < check.length(); i++)
    
        XOR ^=   Integer.parseInt(toHexString(chars[i]));
    
    return XOR;

但是返回的值是“18”,而假设是“20”

输入是我在这里检查的十六进制,它计算正确

http://www.scadacore.com/field-applications/programming-calculators/online-checksum-calculator/

【问题讨论】:

由于这里没有 android 特定的代码,您应该使用 Java 标记。 而且,你知道"00 02".getBytes() 可能不会像你想象的那样返回00, 02 正如@cricket_007 所说,您没有正确地将数据转换为字符。如果你想使用十六进制,你应该使用一个字符数组并跳过转换。 也许你想试试check.split(" ")Integer.valueOf(String s, int radix)。见docs.oracle.com/javase/7/docs/api/java/lang/… 【参考方案1】:

你必须用空格分割你的输入字符串:

public static int getCheckSum(String str) 
    int xor = 0;
    String[] arr = str.split(" ");

    for (int i = 0; i < arr.length; i++)
        xor ^= Integer.parseInt(arr[i], 16);

    return xor;

或者使用流:

public static int getCheckSum(String str) 
    return Arrays.stream(str.split(" "))
                 .map(s -> Integer.parseInt(s, 16))
                 .reduce((a, b) -> a ^ b)
                 .orElse(0);

【讨论】:

以上是关于CheckSum 8 Xor 错误结果的主要内容,如果未能解决你的问题,请参考以下文章

在fedora 8下使用yum install wine,总是提checksum不匹配错误,用了yum clean all之类的命令也不行

checksum是啥意思

pt-table-checksum

Sqlserver关于校验和_备份还原的CHECKSUM

SQL Server:BINARY_CHECKSUM 为相同的值提供不同的结果

主从校验工具pt-table-checksum和pt-table-sync工作原理