From 00034981ef43d5f2f1091a62a327362b9fb7b4e9 Mon Sep 17 00:00:00 2001
From: Redkale <22250530@qq.com>
Date: Sat, 19 May 2018 13:07:36 +0800
Subject: [PATCH]
---
src/org/redkale/util/ByteBufferReader.java | 246 ++++++++++++++-------
src/org/redkale/util/ByteBufferWriter.java | 43 ++--
2 files changed, 196 insertions(+), 93 deletions(-)
diff --git a/src/org/redkale/util/ByteBufferReader.java b/src/org/redkale/util/ByteBufferReader.java
index cd0e3d7d9..e934fdd85 100644
--- a/src/org/redkale/util/ByteBufferReader.java
+++ b/src/org/redkale/util/ByteBufferReader.java
@@ -5,12 +5,12 @@
*/
package org.redkale.util;
-import java.nio.ByteBuffer;
+import java.nio.*;
import java.util.*;
/**
* 以ByteBuffer为数据载体的Reader
- * 注意:ByteBuffer必须是BIG_ENDIAN,且最小可读空间至少是8
+ * 注意:最小可读空间至少是8
*
*
* 详情见: https://redkale.org
@@ -25,11 +25,14 @@ public class ByteBufferReader {
private ByteBuffer currBuffer;
+ private final boolean bigEndian;
+
public ByteBufferReader(Collection buffers) {
Objects.requireNonNull(buffers);
this.buffers = buffers.toArray(new ByteBuffer[buffers.size()]);
this.currBuffer = this.buffers[0];
this.currIndex = 0;
+ this.bigEndian = this.currBuffer.order() == ByteOrder.BIG_ENDIAN;
}
public ByteBufferReader(ByteBuffer[] buffers) {
@@ -37,6 +40,7 @@ public class ByteBufferReader {
this.buffers = buffers;
this.currBuffer = this.buffers[0];
this.currIndex = 0;
+ this.bigEndian = this.currBuffer.order() == ByteOrder.BIG_ENDIAN;
}
public ByteBufferReader(ByteBuffer buffer) {
@@ -44,6 +48,7 @@ public class ByteBufferReader {
this.buffers = new ByteBuffer[]{buffer};
this.currBuffer = this.buffers[0];
this.currIndex = 0;
+ this.bigEndian = this.currBuffer.order() == ByteOrder.BIG_ENDIAN;
}
public static ByteBufferReader create(ByteBuffer buffer) {
@@ -57,8 +62,8 @@ public class ByteBufferReader {
public static ByteBufferReader create(ByteBuffer[] buffers) {
return new ByteBufferReader(buffers);
}
-
- public boolean hasRemaining(){
+
+ public boolean hasRemaining() {
return this.currBuffer.hasRemaining();
}
@@ -80,7 +85,8 @@ public class ByteBufferReader {
this.currBuffer = buf;
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() {
@@ -92,23 +98,42 @@ public class ByteBufferReader {
this.currBuffer = buf;
return buf.getInt();
}
- if (remain == 1) {
- return ((buf.get() << 24)
- | ((get() & 0xff) << 16)
- | ((get() & 0xff) << 8)
- | ((get() & 0xff)));
- }
- if (remain == 2) {
+ if (bigEndian) {
+ if (remain == 1) {
+ return ((buf.get() << 24)
+ | ((get() & 0xff) << 16)
+ | ((get() & 0xff) << 8)
+ | ((get() & 0xff)));
+ }
+ if (remain == 2) {
+ return ((buf.get() << 24)
+ | ((buf.get() & 0xff) << 16)
+ | ((get() & 0xff) << 8)
+ | ((get() & 0xff)));
+ }
+ //remain == 3
return ((buf.get() << 24)
| ((buf.get() & 0xff) << 16)
- | ((get() & 0xff) << 8)
+ | ((buf.get() & 0xff) << 8)
| ((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
- return ((buf.get() << 24)
- | ((buf.get() & 0xff) << 16)
+ return ((buf.get()) & 0xff)
| ((buf.get() & 0xff) << 8)
- | ((get() & 0xff)));
+ | ((buf.get() & 0xff) << 16)
+ | ((get() << 24));
}
public float getFloat() {
@@ -124,75 +149,146 @@ public class ByteBufferReader {
this.currBuffer = buf;
return buf.getLong();
}
- if (remain == 1) {
- return ((((long) buf.get()) << 56)
- | (((long) get() & 0xff) << 48)
- | (((long) get() & 0xff) << 40)
- | (((long) get() & 0xff) << 32)
- | (((long) get() & 0xff) << 24)
- | (((long) get() & 0xff) << 16)
- | (((long) get() & 0xff) << 8)
- | (((long) get() & 0xff)));
- }
- if (remain == 2) {
- return ((((long) buf.get()) << 56)
- | (((long) buf.get() & 0xff) << 48)
- | (((long) get() & 0xff) << 40)
- | (((long) get() & 0xff) << 32)
- | (((long) get() & 0xff) << 24)
- | (((long) get() & 0xff) << 16)
- | (((long) get() & 0xff) << 8)
- | (((long) get() & 0xff)));
- }
- if (remain == 3) {
- return ((((long) buf.get()) << 56)
- | (((long) buf.get() & 0xff) << 48)
- | (((long) buf.get() & 0xff) << 40)
- | (((long) get() & 0xff) << 32)
- | (((long) get() & 0xff) << 24)
- | (((long) get() & 0xff) << 16)
- | (((long) get() & 0xff) << 8)
- | (((long) get() & 0xff)));
- }
- if (remain == 4) {
- return ((((long) buf.get()) << 56)
- | (((long) buf.get() & 0xff) << 48)
- | (((long) buf.get() & 0xff) << 40)
- | (((long) buf.get() & 0xff) << 32)
- | (((long) get() & 0xff) << 24)
- | (((long) get() & 0xff) << 16)
- | (((long) get() & 0xff) << 8)
- | (((long) get() & 0xff)));
- }
- if (remain == 5) {
- 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) get() & 0xff) << 16)
- | (((long) get() & 0xff) << 8)
- | (((long) get() & 0xff)));
- }
- if (remain == 6) {
+ if (bigEndian) {
+ if (remain == 1) {
+ return ((((long) buf.get()) << 56)
+ | (((long) get() & 0xff) << 48)
+ | (((long) get() & 0xff) << 40)
+ | (((long) get() & 0xff) << 32)
+ | (((long) get() & 0xff) << 24)
+ | (((long) get() & 0xff) << 16)
+ | (((long) get() & 0xff) << 8)
+ | (((long) get() & 0xff)));
+ }
+ if (remain == 2) {
+ return ((((long) buf.get()) << 56)
+ | (((long) buf.get() & 0xff) << 48)
+ | (((long) get() & 0xff) << 40)
+ | (((long) get() & 0xff) << 32)
+ | (((long) get() & 0xff) << 24)
+ | (((long) get() & 0xff) << 16)
+ | (((long) get() & 0xff) << 8)
+ | (((long) get() & 0xff)));
+ }
+ if (remain == 3) {
+ return ((((long) buf.get()) << 56)
+ | (((long) buf.get() & 0xff) << 48)
+ | (((long) buf.get() & 0xff) << 40)
+ | (((long) get() & 0xff) << 32)
+ | (((long) get() & 0xff) << 24)
+ | (((long) get() & 0xff) << 16)
+ | (((long) get() & 0xff) << 8)
+ | (((long) get() & 0xff)));
+ }
+ if (remain == 4) {
+ return ((((long) buf.get()) << 56)
+ | (((long) buf.get() & 0xff) << 48)
+ | (((long) buf.get() & 0xff) << 40)
+ | (((long) buf.get() & 0xff) << 32)
+ | (((long) get() & 0xff) << 24)
+ | (((long) get() & 0xff) << 16)
+ | (((long) get() & 0xff) << 8)
+ | (((long) get() & 0xff)));
+ }
+ if (remain == 5) {
+ 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) get() & 0xff) << 16)
+ | (((long) get() & 0xff) << 8)
+ | (((long) get() & 0xff)));
+ }
+ 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)
| (((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) buf.get() & 0xff) << 8)
| (((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
- 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)
+ return ((((long) buf.get() & 0xff))
| (((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() {
diff --git a/src/org/redkale/util/ByteBufferWriter.java b/src/org/redkale/util/ByteBufferWriter.java
index 2bb60d637..4e28ce4d8 100644
--- a/src/org/redkale/util/ByteBufferWriter.java
+++ b/src/org/redkale/util/ByteBufferWriter.java
@@ -5,7 +5,7 @@
*/
package org.redkale.util;
-import java.nio.ByteBuffer;
+import java.nio.*;
import java.util.function.Supplier;
/**
@@ -24,6 +24,8 @@ public class ByteBufferWriter {
private int position;
+ private boolean bigEndian = true;
+
protected ByteBufferWriter(Supplier supplier) {
this.supplier = supplier;
}
@@ -35,6 +37,7 @@ public class ByteBufferWriter {
private ByteBuffer getLastBuffer(int size) {
if (this.buffers == null) {
ByteBuffer buf = supplier.get();
+ this.bigEndian = buf.order() == ByteOrder.BIG_ENDIAN;
this.buffers = Utility.append(this.buffers, buf);
return buf;
} else if (this.buffers[this.buffers.length - 1].remaining() < size) {
@@ -86,23 +89,27 @@ public class ByteBufferWriter {
if (r >= 4) {
buffs[i].putInt(index - start, value);
return this;
- } else if (r == 3) {
- buffs[i].put(index - start, (byte) ((value >> 24) & 0xFF));
- buffs[i].put(index - start + 1, (byte) ((value >> 16) & 0xFF));
- buffs[i].put(index - start + 2, (byte) ((value >> 8) & 0xFF));
- buffs[i + 1].put(0, (byte) (value & 0xFF));
- return this;
- } else if (r == 2) {
- buffs[i].put(index - start, (byte) ((value >> 24) & 0xFF));
- buffs[i].put(index - start + 1, (byte) ((value >> 16) & 0xFF));
- buffs[i + 1].put(0, (byte) ((value >> 8) & 0xFF));
- buffs[i + 1].put(1, (byte) (value & 0xFF));
- return this;
- } else if (r == 1) {
- buffs[i].put(index - start, (byte) ((value >> 24) & 0xFF));
- buffs[i + 1].put(0, (byte) ((value >> 16) & 0xFF));
- buffs[i + 1].put(1, (byte) ((value >> 8) & 0xFF));
- buffs[i + 1].put(2, (byte) (value & 0xFF));
+ } else {
+ byte b1 = bigEndian ? (byte) ((value >> 24) & 0xFF) : (byte) (value & 0xFF);
+ byte b2 = bigEndian ? (byte) ((value >> 16) & 0xFF) : (byte) ((value >> 8) & 0xFF);
+ byte b3 = bigEndian ? (byte) ((value >> 8) & 0xFF) : (byte) ((value >> 16) & 0xFF);
+ byte b4 = bigEndian ? (byte) (value & 0xFF) : (byte) ((value >> 24) & 0xFF);
+ if (r == 3) {
+ buffs[i].put(index - start, b1);
+ buffs[i].put(index - start + 1, b2);
+ buffs[i].put(index - start + 2, b3);
+ buffs[i + 1].put(0, b4);
+ } else if (r == 2) {
+ buffs[i].put(index - start, b1);
+ buffs[i].put(index - start + 1, b2);
+ buffs[i + 1].put(0, b3);
+ buffs[i + 1].put(1, b4);
+ } else if (r == 1) {
+ 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;
}
} else {