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之类的命令也不行