不同长度的JAVA中的XOR Hex String

dej*_*avu 8 java cryptography

我有两个字符串

String s1="426F62";
String s2="457665";
Run Code Online (Sandbox Code Playgroud)

字符串以十六进制表示.我想对他们进行异或.通常逐个字符的异或为除了之外的其他人提供正确的结果F XOR 6.(它给出112,答案应该是9)

请告诉我在JAVA中实现它的正确方法

编辑:转换为int和xoring工作.但是当两个字符串长度不同时如何xor.

Jon*_*eet 15

而不是对Unicode表示进行异或,只需将每个字符转换为它以十六进制表示的数字,将其转换为XOR,然后将其转换回十六进制.你仍然可以一次做一个角色:

public String xorHex(String a, String b) {
    // TODO: Validation
    char[] chars = new char[a.length()];
    for (int i = 0; i < chars.length; i++) {
        chars[i] = toHex(fromHex(a.charAt(i)) ^ fromHex(b.charAt(i)));
    }
    return new String(chars);
}

private static int fromHex(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';
    }
    if (c >= 'A' && c <= 'F') {
        return c - 'A' + 10;
    }
    if (c >= 'a' && c <= 'f') {
        return c - 'a' + 10;
    }
    throw new IllegalArgumentException();
}

private char toHex(int nybble) {
    if (nybble < 0 || nybble > 15) {
        throw new IllegalArgumentException();
    }
    return "0123456789ABCDEF".charAt(nybble);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这应该适用于字符串很长(只要它们的长度相同)并且永远不需要担心负值 - 您将始终只获得对每对字符进行异或的结果.