如何在java Android中编写Xor计算器hex base 16?

时间:2017-02-07 09:14:03

标签: java android encryption xor

如何在Java中编写十六进制(16位)的Xor计算器,如下面的截图所示?第一个输入是键,第二个输入是字符串,第三个是输出。实际上我尝试了很多脚本,然后我搜索了这个问题,但结果并没有像这个计算器那样实现。请帮忙。 Online Xor CalculatorWindows programmer mode calculator

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ImageView sharecode = (ImageView) findViewById(R.id.sharecode);
    final TextView finalcode = (TextView) findViewById(R.id.tvfinalcode);
    final Button calculatcode = (Button) findViewById(R.id.btncalculatcode);
    final EditText tbpin = (EditText) findViewById(R.id.etPin);
    final EditText tbappcode = (EditText) findViewById(R.id.etappcode);
    tbappcode.setFilters(new InputFilter[]{new InputFilter.AllCaps()});


    sharecode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (finalcode.getText().equals("")) {
                Toast.makeText(MainActivity.this, "There is no code to share it!", Toast.LENGTH_LONG).show();
            } else {
                Intent sendIntent = new Intent();
                sendIntent.setAction(Intent.ACTION_SEND);
                sendIntent.putExtra(Intent.EXTRA_TEXT, "Application Code is:" + finalcode.toString());
                sendIntent.setType("text/plain");
                startActivity(sendIntent);
            }

        }
    });

    calculatcode.setOnClickListener(new View.OnClickListener() {
      @Override
        public void onClick(View view) {
         if (tbpin.getText().toString().equals("")) {
             Toast.makeText(MainActivity.this, "Please Enter PIN Code!", Toast.LENGTH_LONG).show();
             } else if (tbappcode.getText().toString().equals("")) {
             Toast.makeText(MainActivity.this, "Please Enter Last part of Appcode Code!", Toast.LENGTH_LONG).show();

             } else {

              String a = tbappcode.getText().toString();
              String b = tbpin.getText().toString();

             int[] encrypted = encrypt(a, b);
              for (int i = 0; i < encrypted.length; i++)

              finalcode.setText(decrypt(encrypted, b));

                  }

               }
           }
    );

}

private static int[] encrypt(String str, String key) {
    int[] output = new int[str.length()];
    for (int i = 0; i < str.length(); i++) {
        int o = (Integer.valueOf(str.charAt(i)) ^ Integer.valueOf(key.charAt(i % (key.length() - 1)))) + '0';
        output[i] = o;
    }
    return output;
}

private static String decrypt(int[] input, String key) {
    String output = "";
    for (int i = 0; i < input.length; i++) {
        output += (char) ((input[i] - 48) ^ (int) key.charAt(i % (key.length() - 1)));
    }
    return output;
}

3 个答案:

答案 0 :(得分:0)

请看下面的计算。

public static void main(String[] args) throws FileNotFoundException {
    int i = 0x316AB2CB;
    int j = 0x19421942;

    int res = i^j;
    System.out.printf("Hex: %x\n", res);
    System.out.printf("Octal: %o\n", res);
    System.out.printf("Decimal: %d\n", res);
}

您可以查看Formatter,因为您可能并不总是有兴趣打印结果。

答案 1 :(得分:0)

您必须将字符串拆分为int或long数字。 当我们有16个基数时,我们必须将此数字更改为2base。 例如(在你的图片中): 第一个输入的最后一个数字是2,第二个输入的最后一个数字是b。

2二进制 - 0010

b in binary - 1011

Xor的结果(如果firstInput =!secondInput)1001,这是9.如图所示。

所以你必须拆分你的String,获得一位数,将其转换为16base数,用第二个字符串执行此操作并使用XOR二元运算符^。

int[] firstInput ={1,9,4,2,1,9,4,2};
int[] secondInput ={3,1,6,a,b,2,c,b};
int[] output = new int[8];
for(i=0;i<firstInput.length();i++){
     output[i]=firstInput[i]^secondInput[i];
}

这只是代码的示例,非常简单和部分。 XoR的操作是^操作符。

答案 2 :(得分:0)

您在python中有运算符^,无需重新发明轮子。

例如:

>>> 0xf54 ^ 0xea3

并输出:

503