我有两个字节数组,它们代表无符号的256位值,我想对它们执行简单的算术运算,例如ADD,SUB,DIV,MUL和EXP-是否可以直接在字节数组上执行这些运算?目前,我将这些字节数组值转换为BigInteger,然后执行计算,但是我有一个想法,那就是这会降低我的性能。您将如何获得最快的结果?

例如,这是我当前的添加功能:

// Both byte arrays are length 32 and represent unsigned 256-bit values
public void add(byte[] data1, byte[] data2) {

    BigInteger value1 = new BigInteger(1, data1);
    BigInteger value2 = new BigInteger(1, data2);
    BigInteger result = value1.add(value2);

    byte[] bytes = result.toByteArray();
    ByteBuffer buffer = ByteBuffer.allocate(32);

    System.arraycopy(bytes, 0, buffer.array(), 32 - bytes.length, bytes.length);
    this.buffer = buffer.array();
}

最佳答案

我认为直接使用byte[]而不是使用BigInteger并不会带来很多好处,但是为了满足您的好奇心,这里有一个示例,说明如何添加两个大小为32的字节数组:

public static byte[] add(byte[] data1, byte[] data2) {
  if(data1.length!=32 || data2.length!=32)
    throw new IllegalArgumentException();
  byte[] result=new byte[32];
  for(int i=31, overflow=0; i>=0; i--) {
    int v = (data1[i]&0xff)+(data2[i]&0xff)+overflow;
    result[i]=(byte)v;
    overflow=v>>>8;
  }
  return result;
}


注意,可以使用输入数组之一作为结果的目标。但是,如果这样的重用甚至会对性能产生负面影响,请不要感到惊讶。在当今的系统上,不再存在“如何加速”的简单答案了……

10-05 23:05
查看更多