This commit is contained in:
Redkale
2018-05-19 13:07:36 +08:00
parent 2b3b33979c
commit 00034981ef
2 changed files with 196 additions and 93 deletions

View File

@@ -5,12 +5,12 @@
*/ */
package org.redkale.util; package org.redkale.util;
import java.nio.ByteBuffer; import java.nio.*;
import java.util.*; import java.util.*;
/** /**
* 以ByteBuffer为数据载体的Reader <br> * 以ByteBuffer为数据载体的Reader <br>
* 注意:ByteBuffer必须是BIG_ENDIAN最小可读空间至少是8 * 注意最小可读空间至少是8
* *
* <p> * <p>
* 详情见: https://redkale.org * 详情见: https://redkale.org
@@ -25,11 +25,14 @@ public class ByteBufferReader {
private ByteBuffer currBuffer; private ByteBuffer currBuffer;
private final boolean bigEndian;
public ByteBufferReader(Collection<ByteBuffer> buffers) { public ByteBufferReader(Collection<ByteBuffer> buffers) {
Objects.requireNonNull(buffers); Objects.requireNonNull(buffers);
this.buffers = buffers.toArray(new ByteBuffer[buffers.size()]); this.buffers = buffers.toArray(new ByteBuffer[buffers.size()]);
this.currBuffer = this.buffers[0]; this.currBuffer = this.buffers[0];
this.currIndex = 0; this.currIndex = 0;
this.bigEndian = this.currBuffer.order() == ByteOrder.BIG_ENDIAN;
} }
public ByteBufferReader(ByteBuffer[] buffers) { public ByteBufferReader(ByteBuffer[] buffers) {
@@ -37,6 +40,7 @@ public class ByteBufferReader {
this.buffers = buffers; this.buffers = buffers;
this.currBuffer = this.buffers[0]; this.currBuffer = this.buffers[0];
this.currIndex = 0; this.currIndex = 0;
this.bigEndian = this.currBuffer.order() == ByteOrder.BIG_ENDIAN;
} }
public ByteBufferReader(ByteBuffer buffer) { public ByteBufferReader(ByteBuffer buffer) {
@@ -44,6 +48,7 @@ public class ByteBufferReader {
this.buffers = new ByteBuffer[]{buffer}; this.buffers = new ByteBuffer[]{buffer};
this.currBuffer = this.buffers[0]; this.currBuffer = this.buffers[0];
this.currIndex = 0; this.currIndex = 0;
this.bigEndian = this.currBuffer.order() == ByteOrder.BIG_ENDIAN;
} }
public static ByteBufferReader create(ByteBuffer buffer) { public static ByteBufferReader create(ByteBuffer buffer) {
@@ -57,8 +62,8 @@ public class ByteBufferReader {
public static ByteBufferReader create(ByteBuffer[] buffers) { public static ByteBufferReader create(ByteBuffer[] buffers) {
return new ByteBufferReader(buffers); return new ByteBufferReader(buffers);
} }
public boolean hasRemaining(){ public boolean hasRemaining() {
return this.currBuffer.hasRemaining(); return this.currBuffer.hasRemaining();
} }
@@ -80,7 +85,8 @@ public class ByteBufferReader {
this.currBuffer = buf; this.currBuffer = buf;
return buf.getShort(); return buf.getShort();
} }
return (short) ((buf.get() << 8) | (get() & 0xff)); if (bigEndian) return (short) ((buf.get() << 8) | (get() & 0xff));
return (short) ((buf.get() & 0xff) | (get() << 8));
} }
public int getInt() { public int getInt() {
@@ -92,23 +98,42 @@ public class ByteBufferReader {
this.currBuffer = buf; this.currBuffer = buf;
return buf.getInt(); return buf.getInt();
} }
if (remain == 1) { if (bigEndian) {
return ((buf.get() << 24) if (remain == 1) {
| ((get() & 0xff) << 16) return ((buf.get() << 24)
| ((get() & 0xff) << 8) | ((get() & 0xff) << 16)
| ((get() & 0xff))); | ((get() & 0xff) << 8)
} | ((get() & 0xff)));
if (remain == 2) { }
if (remain == 2) {
return ((buf.get() << 24)
| ((buf.get() & 0xff) << 16)
| ((get() & 0xff) << 8)
| ((get() & 0xff)));
}
//remain == 3
return ((buf.get() << 24) return ((buf.get() << 24)
| ((buf.get() & 0xff) << 16) | ((buf.get() & 0xff) << 16)
| ((get() & 0xff) << 8) | ((buf.get() & 0xff) << 8)
| ((get() & 0xff))); | ((get() & 0xff)));
} }
if (remain == 1) {
return ((buf.get() & 0xff)
| ((get() & 0xff) << 8)
| ((get() & 0xff) << 16)
| ((get() << 24)));
}
if (remain == 2) {
return ((buf.get() & 0xff)
| ((buf.get() & 0xff) << 8)
| ((get() & 0xff) << 16)
| ((get() << 24)));
}
//remain == 3 //remain == 3
return ((buf.get() << 24) return ((buf.get()) & 0xff)
| ((buf.get() & 0xff) << 16)
| ((buf.get() & 0xff) << 8) | ((buf.get() & 0xff) << 8)
| ((get() & 0xff))); | ((buf.get() & 0xff) << 16)
| ((get() << 24));
} }
public float getFloat() { public float getFloat() {
@@ -124,75 +149,146 @@ public class ByteBufferReader {
this.currBuffer = buf; this.currBuffer = buf;
return buf.getLong(); return buf.getLong();
} }
if (remain == 1) { if (bigEndian) {
return ((((long) buf.get()) << 56) if (remain == 1) {
| (((long) get() & 0xff) << 48) return ((((long) buf.get()) << 56)
| (((long) get() & 0xff) << 40) | (((long) get() & 0xff) << 48)
| (((long) get() & 0xff) << 32) | (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 24) | (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 16) | (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 8) | (((long) get() & 0xff) << 16)
| (((long) get() & 0xff))); | (((long) get() & 0xff) << 8)
} | (((long) get() & 0xff)));
if (remain == 2) { }
return ((((long) buf.get()) << 56) if (remain == 2) {
| (((long) buf.get() & 0xff) << 48) return ((((long) buf.get()) << 56)
| (((long) get() & 0xff) << 40) | (((long) buf.get() & 0xff) << 48)
| (((long) get() & 0xff) << 32) | (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 24) | (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 16) | (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 8) | (((long) get() & 0xff) << 16)
| (((long) get() & 0xff))); | (((long) get() & 0xff) << 8)
} | (((long) get() & 0xff)));
if (remain == 3) { }
return ((((long) buf.get()) << 56) if (remain == 3) {
| (((long) buf.get() & 0xff) << 48) return ((((long) buf.get()) << 56)
| (((long) buf.get() & 0xff) << 40) | (((long) buf.get() & 0xff) << 48)
| (((long) get() & 0xff) << 32) | (((long) buf.get() & 0xff) << 40)
| (((long) get() & 0xff) << 24) | (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 16) | (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 8) | (((long) get() & 0xff) << 16)
| (((long) get() & 0xff))); | (((long) get() & 0xff) << 8)
} | (((long) get() & 0xff)));
if (remain == 4) { }
return ((((long) buf.get()) << 56) if (remain == 4) {
| (((long) buf.get() & 0xff) << 48) return ((((long) buf.get()) << 56)
| (((long) buf.get() & 0xff) << 40) | (((long) buf.get() & 0xff) << 48)
| (((long) buf.get() & 0xff) << 32) | (((long) buf.get() & 0xff) << 40)
| (((long) get() & 0xff) << 24) | (((long) buf.get() & 0xff) << 32)
| (((long) get() & 0xff) << 16) | (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 8) | (((long) get() & 0xff) << 16)
| (((long) get() & 0xff))); | (((long) get() & 0xff) << 8)
} | (((long) get() & 0xff)));
if (remain == 5) { }
return ((((long) buf.get()) << 56) if (remain == 5) {
| (((long) buf.get() & 0xff) << 48) return ((((long) buf.get()) << 56)
| (((long) buf.get() & 0xff) << 40) | (((long) buf.get() & 0xff) << 48)
| (((long) buf.get() & 0xff) << 32) | (((long) buf.get() & 0xff) << 40)
| (((long) buf.get() & 0xff) << 24) | (((long) buf.get() & 0xff) << 32)
| (((long) get() & 0xff) << 16) | (((long) buf.get() & 0xff) << 24)
| (((long) get() & 0xff) << 8) | (((long) get() & 0xff) << 16)
| (((long) get() & 0xff))); | (((long) get() & 0xff) << 8)
} | (((long) get() & 0xff)));
if (remain == 6) { }
if (remain == 6) {
return ((((long) buf.get()) << 56)
| (((long) buf.get() & 0xff) << 48)
| (((long) buf.get() & 0xff) << 40)
| (((long) buf.get() & 0xff) << 32)
| (((long) buf.get() & 0xff) << 24)
| (((long) buf.get() & 0xff) << 16)
| (((long) get() & 0xff) << 8)
| (((long) get() & 0xff)));
}
//remain == 7
return ((((long) buf.get()) << 56) return ((((long) buf.get()) << 56)
| (((long) buf.get() & 0xff) << 48) | (((long) buf.get() & 0xff) << 48)
| (((long) buf.get() & 0xff) << 40) | (((long) buf.get() & 0xff) << 40)
| (((long) buf.get() & 0xff) << 32) | (((long) buf.get() & 0xff) << 32)
| (((long) buf.get() & 0xff) << 24) | (((long) buf.get() & 0xff) << 24)
| (((long) buf.get() & 0xff) << 16) | (((long) buf.get() & 0xff) << 16)
| (((long) get() & 0xff) << 8) | (((long) buf.get() & 0xff) << 8)
| (((long) get() & 0xff))); | (((long) get() & 0xff)));
} }
if (remain == 1) {
return ((((long) buf.get() & 0xff))
| (((long) get() & 0xff) << 8)
| (((long) get() & 0xff) << 16)
| (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 48)
| (((long) get()) << 56));
}
if (remain == 2) {
return ((((long) buf.get() & 0xff))
| (((long) buf.get() & 0xff) << 8)
| (((long) get() & 0xff) << 16)
| (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 48)
| (((long) get()) << 56));
}
if (remain == 3) {
return ((((long) buf.get() & 0xff))
| (((long) buf.get() & 0xff) << 8)
| (((long) buf.get() & 0xff) << 16)
| (((long) get() & 0xff) << 24)
| (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 48)
| (((long) get()) << 56));
}
if (remain == 4) {
return ((((long) buf.get() & 0xff))
| (((long) buf.get() & 0xff) << 8)
| (((long) buf.get() & 0xff) << 16)
| (((long) buf.get() & 0xff) << 24)
| (((long) get() & 0xff) << 32)
| (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 48)
| (((long) get()) << 56));
}
if (remain == 5) {
return ((((long) buf.get() & 0xff))
| (((long) buf.get() & 0xff) << 8)
| (((long) buf.get() & 0xff) << 16)
| (((long) buf.get() & 0xff) << 24)
| (((long) buf.get() & 0xff) << 32)
| (((long) get() & 0xff) << 40)
| (((long) get() & 0xff) << 48)
| (((long) get()) << 56));
}
if (remain == 6) {
return ((((long) buf.get() & 0xff))
| (((long) buf.get() & 0xff) << 8)
| (((long) buf.get() & 0xff) << 16)
| (((long) buf.get() & 0xff) << 24)
| (((long) buf.get() & 0xff) << 32)
| (((long) buf.get() & 0xff) << 40)
| (((long) get() & 0xff) << 48)
| (((long) get()) << 56));
}
//remain == 7 //remain == 7
return ((((long) buf.get()) << 56) return ((((long) buf.get() & 0xff))
| (((long) buf.get() & 0xff) << 48)
| (((long) buf.get() & 0xff) << 40)
| (((long) buf.get() & 0xff) << 32)
| (((long) buf.get() & 0xff) << 24)
| (((long) buf.get() & 0xff) << 16)
| (((long) buf.get() & 0xff) << 8) | (((long) buf.get() & 0xff) << 8)
| (((long) get() & 0xff))); | (((long) buf.get() & 0xff) << 16)
| (((long) buf.get() & 0xff) << 24)
| (((long) buf.get() & 0xff) << 32)
| (((long) buf.get() & 0xff) << 40)
| (((long) buf.get() & 0xff) << 48)
| (((long) get()) << 56));
} }
public double getDouble() { public double getDouble() {

View File

@@ -5,7 +5,7 @@
*/ */
package org.redkale.util; package org.redkale.util;
import java.nio.ByteBuffer; import java.nio.*;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
@@ -24,6 +24,8 @@ public class ByteBufferWriter {
private int position; private int position;
private boolean bigEndian = true;
protected ByteBufferWriter(Supplier<ByteBuffer> supplier) { protected ByteBufferWriter(Supplier<ByteBuffer> supplier) {
this.supplier = supplier; this.supplier = supplier;
} }
@@ -35,6 +37,7 @@ public class ByteBufferWriter {
private ByteBuffer getLastBuffer(int size) { private ByteBuffer getLastBuffer(int size) {
if (this.buffers == null) { if (this.buffers == null) {
ByteBuffer buf = supplier.get(); ByteBuffer buf = supplier.get();
this.bigEndian = buf.order() == ByteOrder.BIG_ENDIAN;
this.buffers = Utility.append(this.buffers, buf); this.buffers = Utility.append(this.buffers, buf);
return buf; return buf;
} else if (this.buffers[this.buffers.length - 1].remaining() < size) { } else if (this.buffers[this.buffers.length - 1].remaining() < size) {
@@ -86,23 +89,27 @@ public class ByteBufferWriter {
if (r >= 4) { if (r >= 4) {
buffs[i].putInt(index - start, value); buffs[i].putInt(index - start, value);
return this; return this;
} else if (r == 3) { } else {
buffs[i].put(index - start, (byte) ((value >> 24) & 0xFF)); byte b1 = bigEndian ? (byte) ((value >> 24) & 0xFF) : (byte) (value & 0xFF);
buffs[i].put(index - start + 1, (byte) ((value >> 16) & 0xFF)); byte b2 = bigEndian ? (byte) ((value >> 16) & 0xFF) : (byte) ((value >> 8) & 0xFF);
buffs[i].put(index - start + 2, (byte) ((value >> 8) & 0xFF)); byte b3 = bigEndian ? (byte) ((value >> 8) & 0xFF) : (byte) ((value >> 16) & 0xFF);
buffs[i + 1].put(0, (byte) (value & 0xFF)); byte b4 = bigEndian ? (byte) (value & 0xFF) : (byte) ((value >> 24) & 0xFF);
return this; if (r == 3) {
} else if (r == 2) { buffs[i].put(index - start, b1);
buffs[i].put(index - start, (byte) ((value >> 24) & 0xFF)); buffs[i].put(index - start + 1, b2);
buffs[i].put(index - start + 1, (byte) ((value >> 16) & 0xFF)); buffs[i].put(index - start + 2, b3);
buffs[i + 1].put(0, (byte) ((value >> 8) & 0xFF)); buffs[i + 1].put(0, b4);
buffs[i + 1].put(1, (byte) (value & 0xFF)); } else if (r == 2) {
return this; buffs[i].put(index - start, b1);
} else if (r == 1) { buffs[i].put(index - start + 1, b2);
buffs[i].put(index - start, (byte) ((value >> 24) & 0xFF)); buffs[i + 1].put(0, b3);
buffs[i + 1].put(0, (byte) ((value >> 16) & 0xFF)); buffs[i + 1].put(1, b4);
buffs[i + 1].put(1, (byte) ((value >> 8) & 0xFF)); } else if (r == 1) {
buffs[i + 1].put(2, (byte) (value & 0xFF)); buffs[i].put(index - start, b1);
buffs[i + 1].put(0, b2);
buffs[i + 1].put(1, b3);
buffs[i + 1].put(2, b4);
}
return this; return this;
} }
} else { } else {