19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class HexDump
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String dumpHexString(byte[] array)
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dumpHexString(array, 0, array.length);
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String dumpHexString(byte[] array, int offset, int length)
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder result = new StringBuilder();
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] line = new byte[16];
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lineIndex = 0;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.append("\n0x");
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.append(toHexString(offset));
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = offset ; i < offset + length ; i++)
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (lineIndex == 16)
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result.append(" ");
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int j = 0 ; j < 16 ; j++)
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (line[j] > ' ' && line[j] < '~')
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        result.append(new String(line, j, 1));
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    else
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        result.append(".");
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result.append("\n0x");
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result.append(toHexString(i));
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lineIndex = 0;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte b = array[i];
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result.append(" ");
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result.append(HEX_DIGITS[(b >>> 4) & 0x0F]);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result.append(HEX_DIGITS[b & 0x0F]);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            line[lineIndex++] = b;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lineIndex != 16)
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = (16 - lineIndex) * 3;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count++;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0 ; i < count ; i++)
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result.append(" ");
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0 ; i < lineIndex ; i++)
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (line[i] > ' ' && line[i] < '~')
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result.append(new String(line, i, 1));
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                else
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result.append(".");
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result.toString();
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String toHexString(byte b)
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return toHexString(toByteArray(b));
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String toHexString(byte[] array)
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return toHexString(array, 0, array.length);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String toHexString(byte[] array, int offset, int length)
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char[] buf = new char[length * 2];
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int bufIndex = 0;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = offset ; i < offset + length; i++)
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte b = array[i];
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F];
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buf[bufIndex++] = HEX_DIGITS[b & 0x0F];
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new String(buf);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String toHexString(int i)
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return toHexString(toByteArray(i));
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static byte[] toByteArray(byte b)
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] array = new byte[1];
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        array[0] = b;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return array;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static byte[] toByteArray(int i)
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] array = new byte[4];
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        array[3] = (byte)(i & 0xFF);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        array[2] = (byte)((i >> 8) & 0xFF);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        array[1] = (byte)((i >> 16) & 0xFF);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        array[0] = (byte)((i >> 24) & 0xFF);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return array;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int toByte(char c)
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= '0' && c <= '9') return (c - '0');
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException ("Invalid hex char '" + c + "'");
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static byte[] hexStringToByteArray(String hexString)
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int length = hexString.length();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = new byte[length / 2];
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0 ; i < length ; i += 2)
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer[i / 2] = (byte)((toByte(hexString.charAt(i)) << 4) | toByte(hexString.charAt(i+1)));
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buffer;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
165