/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.javascript.typedarrays;
public class ByteIo
{
public static Object readInt8(byte[] buf, int offset)
{
return buf[offset];
}
public static void writeInt8(byte[] buf, int offset, int val)
{
buf[offset] = (byte)val;
}
public static Object readUint8(byte[] buf, int offset)
{
return buf[offset] & 0xff;
}
public static void writeUint8(byte[] buf, int offset, int val)
{
buf[offset] = (byte)(val & 0xff);
}
private static short doReadInt16(byte[] buf, int offset, boolean littleEndian)
{
// Need to coalesce to short here so that we stay in range
if (littleEndian) {
return
(short)((buf[offset] & 0xff) |
((buf[offset + 1] & 0xff) << 8));
}
return
(short)(((buf[offset] & 0xff) << 8) |
(buf[offset + 1] & 0xff));
}
private static void doWriteInt16(byte[] buf, int offset, int val, boolean littleEndian)
{
if (littleEndian) {
buf[offset] = (byte)(val & 0xff);
buf[offset + 1] = (byte)((val >>> 8) & 0xff);
} else {
buf[offset] = (byte)((val >>> 8) & 0xff);
buf[offset + 1] = (byte)(val & 0xff);
}
}
public static Object readInt16(byte[] buf, int offset, boolean littleEndian)
{
return doReadInt16(buf, offset, littleEndian);
}
public static void writeInt16(byte[] buf, int offset, int val, boolean littleEndian)
{
doWriteInt16(buf, offset, val, littleEndian);
}
public static Object readUint16(byte[] buf, int offset, boolean littleEndian)
{
return doReadInt16(buf, offset, littleEndian) & 0xffff;
}
public static void writeUint16(byte[] buf, int offset, int val, boolean littleEndian)
{
doWriteInt16(buf, offset, val & 0xffff, littleEndian);
}
public static Object readInt32(byte[] buf, int offset, boolean littleEndian)
{
if (littleEndian) {
return
(buf[offset] & 0xff) |
((buf[offset + 1] & 0xff) << 8) |
((buf[offset + 2] & 0xff) << 16) |
((buf[offset + 3] & 0xff) << 24);
}
return
((buf[offset] & 0xff) << 24) |
((buf[offset + 1] & 0xff) << 16) |
((buf[offset + 2] & 0xff) << 8) |
(buf[offset + 3] & 0xff);
}
public static void writeInt32(byte[] buf, int offset, int val, boolean littleEndian)
{
if (littleEndian) {
buf[offset] = (byte)(val & 0xff);
buf[offset + 1] = (byte)((val >>> 8) & 0xff);
buf[offset + 2] = (byte)((val >>> 16) & 0xff);
buf[offset + 3] = (byte)((val >>> 24) & 0xff);
} else {
buf[offset] = (byte)((val >>> 24) & 0xff);
buf[offset + 1] = (byte)((val >>> 16) & 0xff);
buf[offset + 2] = (byte)((val >>> 8) & 0xff);
buf[offset + 3] = (byte)(val & 0xff);
}
}
public static long readUint32Primitive(byte[] buf, int offset, boolean littleEndian)
{
if (littleEndian) {
return
((buf[offset] & 0xffL) |
((buf[offset + 1] & 0xffL) << 8L) |
((buf[offset + 2] & 0xffL) << 16L) |
((buf[offset + 3] & 0xffL) << 24L)) &
0xffffffffL;
}
return
(((buf[offset] & 0xffL) << 24L) |
((buf[offset + 1] & 0xffL) << 16L) |
((buf[offset + 2] & 0xffL) << 8L) |
(buf[offset + 3] & 0xffL)) &
0xffffffffL;
}
public static void writeUint32(byte[] buf, int offset, long val, boolean littleEndian)
{
if (littleEndian) {
buf[offset] = (byte)(val & 0xffL);
buf[offset + 1] = (byte)((val >>> 8L) & 0xffL);
buf[offset + 2] = (byte)((val >>> 16L) & 0xffL);
buf[offset + 3] = (byte)((val >>> 24L) & 0xffL);
} else {
buf[offset] = (byte)((val >>> 24L) & 0xffL);
buf[offset + 1] = (byte)((val >>> 16L) & 0xffL);
buf[offset + 2] = (byte)((val >>> 8L) & 0xffL);
buf[offset + 3] = (byte)(val & 0xffL);
}
}
public static Object readUint32(byte[] buf, int offset, boolean littleEndian)
{
return readUint32Primitive(buf, offset, littleEndian);
}
public static long readUint64Primitive(byte[] buf, int offset, boolean littleEndian)
{
if (littleEndian) {
return
((buf[offset] & 0xffL) |
((buf[offset + 1] & 0xffL) << 8L) |
((buf[offset + 2] & 0xffL) << 16L) |
((buf[offset + 3] & 0xffL) << 24L) |
((buf[offset + 4] & 0xffL) << 32L) |
((buf[offset + 5] & 0xffL) << 40L) |
((buf[offset + 6] & 0xffL) << 48L) |
((buf[offset + 7] & 0xffL) << 56L));
}
return
(((buf[offset] & 0xffL) << 56L) |
((buf[offset + 1] & 0xffL) << 48L) |
((buf[offset + 2] & 0xffL) << 40L) |
((buf[offset + 3] & 0xffL) << 32L) |
((buf[offset + 4] & 0xffL) << 24L) |
((buf[offset + 5] & 0xffL) << 16L) |
((buf[offset + 6] & 0xffL) << 8L) |
((buf[offset + 7] & 0xffL) << 0L));
}
public static void writeUint64(byte[] buf, int offset, long val, boolean littleEndian)
{
if (littleEndian) {
buf[offset] = (byte)(val & 0xffL);
buf[offset + 1] = (byte)((val >>> 8L) & 0xffL);
buf[offset + 2] = (byte)((val >>> 16L) & 0xffL);
buf[offset + 3] = (byte)((val >>> 24L) & 0xffL);
buf[offset + 4] = (byte)((val >>> 32L) & 0xffL);
buf[offset + 5] = (byte)((val >>> 40L) & 0xffL);
buf[offset + 6] = (byte)((val >>> 48L) & 0xffL);
buf[offset + 7] = (byte)((val >>> 56L) & 0xffL);
} else {
buf[offset] = (byte)((val >>> 56L) & 0xffL);
buf[offset + 1] = (byte)((val >>> 48L) & 0xffL);
buf[offset + 2] = (byte)((val >>> 40L) & 0xffL);
buf[offset + 3] = (byte)((val >>> 32L) & 0xffL);
buf[offset + 4] = (byte)((val >>> 24L) & 0xffL);
buf[offset + 5] = (byte)((val >>> 16L) & 0xffL);
buf[offset + 6] = (byte)((val >>> 8L) & 0xffL);
buf[offset + 7] = (byte)(val & 0xffL);
}
}
public static Object readFloat32(byte[] buf, int offset, boolean littleEndian)
{
long base = readUint32Primitive(buf, offset, littleEndian);
return Float.intBitsToFloat((int)base);
}
public static void writeFloat32(byte[] buf, int offset, double val, boolean littleEndian)
{
long base = Float.floatToIntBits((float)val);
writeUint32(buf, offset, base, littleEndian);
}
public static Object readFloat64(byte[] buf, int offset, boolean littleEndian)
{
long base = readUint64Primitive(buf, offset, littleEndian);
return Double.longBitsToDouble(base);
}
public static void writeFloat64(byte[] buf, int offset, double val, boolean littleEndian)
{
long base = Double.doubleToLongBits(val);
writeUint64(buf, offset, base, littleEndian);
}
}