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 {