2字节数组的区别
difference of 2 byte arrays
我有一个最多可包含 4000 个元素的字节数组。
这些元素可以是 byte/boolean(1 byte) int(2 byte) 或 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));
}
}
但这需要相当长的时间。
有什么提高性能的想法吗?
通过比较字节找到第一个差异,然后将此索引除以缓冲区中单个元素的大小:
int pos = findFirstDifference(a, b);
pos /= type.elementSize();
我觉得你的代码太复杂了。您可以找到差异的绝对位置,然后将其除以数组类型的大小。
示例代码:
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;
}
我有一个最多可包含 4000 个元素的字节数组。 这些元素可以是 byte/boolean(1 byte) int(2 byte) 或 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));
}
}
但这需要相当长的时间。 有什么提高性能的想法吗?
通过比较字节找到第一个差异,然后将此索引除以缓冲区中单个元素的大小:
int pos = findFirstDifference(a, b);
pos /= type.elementSize();
我觉得你的代码太复杂了。您可以找到差异的绝对位置,然后将其除以数组类型的大小。
示例代码:
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;
}