diff --git a/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java b/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java index 77e5cce6aa..f8ca525b76 100644 --- a/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java +++ b/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java @@ -438,7 +438,8 @@ public final class ByteBufUtil { */ @SuppressWarnings("deprecation") public static ByteBuf writeShortBE(ByteBuf buf, int shortValue) { - return buf.order() == ByteOrder.BIG_ENDIAN? buf.writeShort(shortValue) : buf.writeShortLE(shortValue); + return buf.order() == ByteOrder.BIG_ENDIAN? buf.writeShort(shortValue) : + buf.writeShort(swapShort((short) shortValue)); } /** @@ -446,7 +447,8 @@ public final class ByteBufUtil { */ @SuppressWarnings("deprecation") public static ByteBuf setShortBE(ByteBuf buf, int index, int shortValue) { - return buf.order() == ByteOrder.BIG_ENDIAN? buf.setShort(index, shortValue) : buf.setShortLE(index, shortValue); + return buf.order() == ByteOrder.BIG_ENDIAN? buf.setShort(index, shortValue) : + buf.setShort(index, swapShort((short) shortValue)); } /** @@ -454,7 +456,8 @@ public final class ByteBufUtil { */ @SuppressWarnings("deprecation") public static ByteBuf writeMediumBE(ByteBuf buf, int mediumValue) { - return buf.order() == ByteOrder.BIG_ENDIAN? buf.writeMedium(mediumValue) : buf.writeMediumLE(mediumValue); + return buf.order() == ByteOrder.BIG_ENDIAN? buf.writeMedium(mediumValue) : + buf.writeMedium(swapMedium(mediumValue)); } /** diff --git a/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java b/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java index 1f4cc186b9..87783c5c95 100644 --- a/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java @@ -543,7 +543,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public short readShortLE() { - return buf.readShort(); + return buf.readShortLE(); } @Override @@ -563,7 +563,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public int readMediumLE() { - return buf.readMedium(); + return buf.readMediumLE(); } @Override @@ -583,7 +583,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public int readIntLE() { - return buf.readInt(); + return buf.readIntLE(); } @Override @@ -603,7 +603,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public long readLongLE() { - return buf.readLong(); + return buf.readLongLE(); } @Override @@ -719,7 +719,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public ByteBuf writeShortLE(int value) { - buf.writeShort((short) value); + buf.writeShortLE((short) value); return this; } @@ -731,7 +731,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public ByteBuf writeMediumLE(int value) { - buf.writeMedium(value); + buf.writeMediumLE(value); return this; } @@ -743,7 +743,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public ByteBuf writeIntLE(int value) { - buf.writeInt(value); + buf.writeIntLE(value); return this; } @@ -755,7 +755,7 @@ public class SwappedByteBuf extends ByteBuf { @Override public ByteBuf writeLongLE(long value) { - buf.writeLong(value); + buf.writeLongLE(value); return this; } diff --git a/buffer/src/test/java/io/netty/buffer/AbstractByteBufTest.java b/buffer/src/test/java/io/netty/buffer/AbstractByteBufTest.java index e0b64d5678..e68bac828c 100644 --- a/buffer/src/test/java/io/netty/buffer/AbstractByteBufTest.java +++ b/buffer/src/test/java/io/netty/buffer/AbstractByteBufTest.java @@ -4939,4 +4939,63 @@ public abstract class AbstractByteBufTest { buffer.release(); } } + + @Test + public void testEndiannessIndexOf() { + buffer.clear(); + final int v = 0x02030201; + buffer.writeIntLE(v); + buffer.writeByte(0x01); + + assertEquals(-1, buffer.indexOf(1, 4, (byte) 1)); + assertEquals(-1, buffer.indexOf(4, 1, (byte) 1)); + assertEquals(1, buffer.indexOf(1, 4, (byte) 2)); + assertEquals(3, buffer.indexOf(4, 1, (byte) 2)); + } + + @Test + public void explicitLittleEndianReadMethodsMustAlwaysUseLittleEndianByteOrder() { + buffer.clear(); + buffer.writeBytes(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + assertEquals(0x0201, buffer.readShortLE()); + buffer.readerIndex(0); + assertEquals(0x0201, buffer.readUnsignedShortLE()); + buffer.readerIndex(0); + assertEquals(0x030201, buffer.readMediumLE()); + buffer.readerIndex(0); + assertEquals(0x030201, buffer.readUnsignedMediumLE()); + buffer.readerIndex(0); + assertEquals(0x04030201, buffer.readIntLE()); + buffer.readerIndex(0); + assertEquals(0x04030201, buffer.readUnsignedIntLE()); + buffer.readerIndex(0); + assertEquals(0x04030201, Float.floatToRawIntBits(buffer.readFloatLE())); + buffer.readerIndex(0); + assertEquals(0x0807060504030201L, buffer.readLongLE()); + buffer.readerIndex(0); + assertEquals(0x0807060504030201L, Double.doubleToRawLongBits(buffer.readDoubleLE())); + buffer.readerIndex(0); + } + + @Test + public void explicitLittleEndianWriteMethodsMustAlwaysUseLittleEndianByteOrder() { + buffer.clear(); + buffer.writeShortLE(0x0102); + assertEquals(0x0102, buffer.readShortLE()); + buffer.clear(); + buffer.writeMediumLE(0x010203); + assertEquals(0x010203, buffer.readMediumLE()); + buffer.clear(); + buffer.writeIntLE(0x01020304); + assertEquals(0x01020304, buffer.readIntLE()); + buffer.clear(); + buffer.writeFloatLE(Float.intBitsToFloat(0x01020304)); + assertEquals(0x01020304, Float.floatToRawIntBits(buffer.readFloatLE())); + buffer.clear(); + buffer.writeLongLE(0x0102030405060708L); + assertEquals(0x0102030405060708L, buffer.readLongLE()); + buffer.clear(); + buffer.writeDoubleLE(Double.longBitsToDouble(0x0102030405060708L)); + assertEquals(0x0102030405060708L, Double.doubleToRawLongBits(buffer.readDoubleLE())); + } } diff --git a/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java b/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java index 5767f42f1b..fd6aba2948 100644 --- a/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java +++ b/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java @@ -189,7 +189,7 @@ public class ByteBufUtilTest { buf = buffer(2).order(ByteOrder.LITTLE_ENDIAN); ByteBufUtil.writeShortBE(buf, expected); - assertEquals((short) expected, buf.readShortLE()); + assertEquals(ByteBufUtil.swapShort((short) expected), buf.readShortLE()); buf.resetReaderIndex(); assertEquals(ByteBufUtil.swapShort((short) expected), buf.readShort()); buf.release(); @@ -209,7 +209,7 @@ public class ByteBufUtilTest { buf = Unpooled.wrappedBuffer(new byte[2]).order(ByteOrder.LITTLE_ENDIAN); ByteBufUtil.setShortBE(buf, 0, shortValue); - assertEquals((short) shortValue, buf.readShortLE()); + assertEquals(ByteBufUtil.swapShort((short) shortValue), buf.readShortLE()); buf.resetReaderIndex(); assertEquals(ByteBufUtil.swapShort((short) shortValue), buf.readShort()); buf.release(); @@ -229,7 +229,7 @@ public class ByteBufUtilTest { buf = buffer(4).order(ByteOrder.LITTLE_ENDIAN); ByteBufUtil.writeMediumBE(buf, mediumValue); - assertEquals(mediumValue, buf.readMediumLE()); + assertEquals(ByteBufUtil.swapMedium(mediumValue), buf.readMediumLE()); buf.resetReaderIndex(); assertEquals(ByteBufUtil.swapMedium(mediumValue), buf.readMedium()); buf.release();