2字节数组的差异

时间:2015-05-06 13:50:18

标签: java arrays byte difference

我有一个字节数组,最多可包含4000个元素。 这些元素可以是byte / boolean(1字节)int(2字节)或long / float(4byte)。 它们不是混合的,因此一个字节数组只包含一种数据类型

如果数组发生变化,我想获得受影响的位置。 但是如果arr [5]发生变化,那么它就是第二个真实值已经改变了!但如果是布尔值则是第6个值。

到目前为止我已经完成了这个

private void diff(byte[] a, byte[] b){
if (a.length == b.length) {
        for (int i = 0; i < getCount(); i++) {
            if (!get(MyType.real,i, b).equals(get(MyType.real,i, a))) {
                //difference
            }
        }
        this.data = data;
    }
}

private Object get(MyType type, int idx, byte[] data) {
    logger.entry(idx, data);
    ByteBuffer buffer = ByteBuffer.wrap(data)
            .order(ByteOrder.LITTLE_ENDIAN);
    switch (type) {
    case BOOL:
        return logger.exit(buffer.get(idx) > 0);
    case DWORD:
        return logger.exit(buffer.asIntBuffer().get(idx));
    case INT:
        return logger.exit(buffer.asShortBuffer().get(idx));
    case REAL:
        return logger.exit(buffer.asFloatBuffer().get(idx));
    case TIME:
        return logger.exit(buffer.asIntBuffer().get(idx));
    default:
        return logger.exit(buffer.get(idx));
    }
}

但这需要很长时间。 有什么提高性能的想法吗?

2 个答案:

答案 0 :(得分:1)

我认为你的代码太复杂了。您可以找到差异的绝对位置,然后除以数组类型的大小。

示例代码:

private int diffpos(byte[] a, byte[] b, int typeLenght){
    if (a.length == b.length) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] != b[i]) {
                return i / typeLenght;
            }
        }
    }
    return 0;
}

答案 1 :(得分:0)

通过比较字节找出第一个差异,然后将此索引除以缓冲区中单个元素的大小:

int pos = findFirstDifference(a, b);
pos /= type.elementSize();
相关问题