This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user