diff graal/com.oracle.max.base/src/com/sun/max/lang/Bytes.java @ 3733:e233f5660da4

Added Java files from Maxine project.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sat, 17 Dec 2011 19:59:18 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.base/src/com/sun/max/lang/Bytes.java	Sat Dec 17 19:59:18 2011 +0100
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.max.lang;
+
+import java.io.*;
+
+import com.sun.max.io.*;
+import com.sun.max.util.*;
+
+/**
+ * Byte and byte array operations.
+ */
+public final class Bytes {
+
+    private Bytes() {
+    }
+
+    public static final int SIZE = 1;
+    public static final int WIDTH = 8;
+    public static final int MASK = 0xff;
+
+    public static final Range VALUE_RANGE = new Range(Byte.MIN_VALUE, Byte.MAX_VALUE);
+
+    public static int zeroExtendedToInt(byte b) {
+        final char ch = (char) b;
+        return ch;
+    }
+
+    /**
+     * Returns the number of zero bits following the lowest-order ("rightmost")
+     * one-bit in the two's complement binary representation of the specified
+     * {@code byte} value.  Returns 8 if the specified value has no
+     * one-bits in its two's complement representation, in other words if it is
+     * equal to zero.
+     *
+     * @return the number of zero bits following the lowest-order ("rightmost")
+     *     one-bit in the two's complement binary representation of the
+     *     specified {@code byte} value, or 8 if the value is equal
+     *     to zero.
+     */
+    public static int numberOfTrailingZeros(byte b) {
+        // HD, Figure 5-14
+        int y;
+        int i = b & 0xFF;
+        if (i == 0) {
+            return 8;
+        }
+        int n = 7;
+        y = (i << 4) & 0xFF;
+        if (y != 0) {
+            n = n - 4;
+            i = y;
+        }
+        y = (i << 2) & 0xFF;
+        if (y != 0) {
+            n = n - 2;
+            i = y;
+        }
+        return n - (((i << 1) & 0xFF) >>> 7);
+    }
+
+    /**
+     * Are the bytes of an array, starting at some position, equal to the contents
+     * of a second array.
+     * @param array1 An array of bytes
+     * @param startIndex1  Index in {@code array1} at which to start comparison
+     * @param array2 An array of bytes to be compared
+     * @return tree iff the entire contents of {@code array2} are equal to
+     * the contents of {@code array1}, starting at {@code startIndex1}.
+     */
+    public static boolean equals(byte[] array1, int startIndex1, byte[] array2) {
+        if (array1.length < startIndex1 + array2.length) {
+            return false;
+        }
+        for (int i = 0; i < array2.length; i++) {
+            if (array1[startIndex1 + i] != array2[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Compares the first {@code length} bytes in two byte arrays
+     * for equality.
+     */
+    public static boolean equals(byte[] array1, byte[] array2, int length) {
+        if (array1.length < length || array2.length < length) {
+            return false;
+        }
+        for (int i = 0; i < length; i++) {
+            if (array1[i] != array2[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Compares the contents of two byte arrays for equality.
+     */
+    public static boolean equals(byte[] array1, byte[] array2) {
+        if (array1 == array2) {
+            return true;
+        }
+        if (array1.length != array2.length) {
+            return false;
+        }
+        return equals(array1, array2, array1.length);
+    }
+
+    public static void copy(byte[] fromArray, int fromStartIndex, byte[] toArray,
+                            final int toStartIndex, int nBytes) {
+        for (int i = 0; i < nBytes; i++) {
+            toArray[toStartIndex + i] = fromArray[fromStartIndex + i];
+        }
+    }
+
+    public static void copy(byte[] fromArray, byte[] toArray, int nBytes) {
+        copy(fromArray, 0, toArray, 0, nBytes);
+    }
+
+    public static void copyAll(byte[] fromArray, byte[] toArray, int toStartIndex) {
+        copy(fromArray, 0, toArray, toStartIndex, fromArray.length);
+    }
+
+    public static void copyAll(byte[] fromArray, byte[] toArray) {
+        copy(fromArray, 0, toArray, 0, fromArray.length);
+    }
+
+    public static byte[] withLength(byte[] array, int length) {
+        final byte[] result = new byte[length];
+        if (length >= array.length) {
+            copyAll(array, result);
+        } else {
+            copy(array, result, length);
+        }
+        return result;
+    }
+
+    public static byte[] getSection(byte[] fromArray, int startIndex, int endIndex) {
+        final int length = endIndex - startIndex;
+        final byte[] result = new byte[length];
+        copy(fromArray, startIndex, result, 0, length);
+        return result;
+    }
+
+    /**
+     * Assigns zero to every byte in an array.
+     */
+    public static void clear(byte[] array) {
+        for (int i = 0; i < array.length; i++) {
+            array[i] = (byte) 0;
+        }
+    }
+
+    public static boolean areClear(byte[] array) {
+        for (int i = 0; i < array.length; i++) {
+            if (array[i] != (byte) 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @param value  a byte
+     * @return A string representation of the byte in hexadecimal, e.g. "0x0A"
+     */
+    public static String toHexLiteral(byte value) {
+        String hexString = Integer.toHexString(value).toUpperCase();
+        if (hexString.length() == 1) {
+            hexString = "0" + hexString;
+        } else if (hexString.length() > 2) {
+            hexString = hexString.substring(hexString.length() - 2);
+        }
+        return "0x" + hexString;
+    }
+
+    /**
+     * @param values an array of bytes
+     * @return A string representation of the bytes in hexadecimal, e.g. "0x01A203"
+     */
+    public static String toHexLiteral(byte[] values) {
+        String s = "0x";
+        for (byte value : values) {
+            String hexString = Integer.toHexString(value).toUpperCase();
+            if (hexString.length() == 1) {
+                hexString = "0" + hexString;
+            }
+            s += hexString;
+        }
+        return s;
+    }
+
+    /**
+     * Returns a string representation of the contents of the specified array.
+     * Adjacent elements are separated by the specified separator. Elements are
+     * converted to strings with {@link #toHexLiteral(byte)}.
+     *
+     * @param array     the array whose string representation to return
+     * @param separator the separator to use
+     * @return a string representation of <tt>array</tt>
+     * @throws NullPointerException if {@code array} or {@code separator} is null
+     */
+    public static String toHexString(byte[] array, String separator) {
+        if (array == null || separator == null) {
+            throw new NullPointerException();
+        }
+        if (array.length == 0) {
+            return "";
+        }
+
+        final StringBuilder buf = new StringBuilder();
+        buf.append(toHexLiteral(array[0]));
+
+        for (int i = 1; i < array.length; i++) {
+            buf.append(separator);
+            buf.append(toHexLiteral(array[i]));
+        }
+
+        return buf.toString();
+    }
+
+    public static byte[] fromInputStream(InputStream inputStream) throws IOException {
+        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Streams.copy(inputStream, outputStream);
+        return outputStream.toByteArray();
+    }
+
+}