17c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet/*
27c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Copyright (C) 2006 The Android Open Source Project
37c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *
47c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Licensed under the Apache License, Version 2.0 (the "License");
57c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * you may not use this file except in compliance with the License.
67c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * You may obtain a copy of the License at
77c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *
87c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *      http://www.apache.org/licenses/LICENSE-2.0
97c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *
107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Unless required by applicable law or agreed to in writing, software
117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * distributed under the License is distributed on an "AS IS" BASIS,
127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * See the License for the specific language governing permissions and
147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * limitations under the License.
157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet */
167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpackage com.google.polo.pairing;
187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpublic class HexDump
207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet{
217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String dumpHexString(byte[] array)
247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return dumpHexString(array, 0, array.length);
267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String dumpHexString(byte[] array, int offset, int length)
297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        StringBuilder result = new StringBuilder();
317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        byte[] line = new byte[16];
337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        int lineIndex = 0;
347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        result.append("\n0x");
367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        result.append(toHexString(offset));
377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = offset ; i < offset + length ; i++)
397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        {
407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (lineIndex == 16)
417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            {
427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                result.append(" ");
437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                for (int j = 0 ; j < 16 ; j++)
457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                {
467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    if (line[j] > ' ' && line[j] < '~')
477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    {
487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        result.append(new String(line, j, 1));
497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    }
507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    else
517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    {
527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        result.append(".");
537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    }
547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                result.append("\n0x");
577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                result.append(toHexString(i));
587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                lineIndex = 0;
597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            byte b = array[i];
627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            result.append(" ");
637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            result.append(HEX_DIGITS[(b >>> 4) & 0x0F]);
647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            result.append(HEX_DIGITS[b & 0x0F]);
657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            line[lineIndex++] = b;
677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (lineIndex != 16)
707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        {
717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            int count = (16 - lineIndex) * 3;
727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            count++;
737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (int i = 0 ; i < count ; i++)
747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            {
757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                result.append(" ");
767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (int i = 0 ; i < lineIndex ; i++)
797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            {
807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (line[i] > ' ' && line[i] < '~')
817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                {
827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    result.append(new String(line, i, 1));
837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                else
857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                {
867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    result.append(".");
877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return result.toString();
927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String toHexString(byte b)
957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toHexString(toByteArray(b));
977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String toHexString(byte[] array)
1007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toHexString(array, 0, array.length);
1027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String toHexString(byte[] array, int offset, int length)
1057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        char[] buf = new char[length * 2];
1077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        int bufIndex = 0;
1097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = offset ; i < offset + length; i++)
1107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        {
1117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            byte b = array[i];
1127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F];
1137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            buf[bufIndex++] = HEX_DIGITS[b & 0x0F];
1147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return new String(buf);
1177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String toHexString(int i)
1207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toHexString(toByteArray(i));
1227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static byte[] toByteArray(byte b)
1257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        byte[] array = new byte[1];
1277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        array[0] = b;
1287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return array;
1297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static byte[] toByteArray(int i)
1327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        byte[] array = new byte[4];
1347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        array[3] = (byte)(i & 0xFF);
1367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        array[2] = (byte)((i >> 8) & 0xFF);
1377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        array[1] = (byte)((i >> 16) & 0xFF);
1387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        array[0] = (byte)((i >> 24) & 0xFF);
1397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return array;
1417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private static int toByte(char c)
1447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (c >= '0' && c <= '9') return (c - '0');
1467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
1477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
1487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        throw new RuntimeException ("Invalid hex char '" + c + "'");
1507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static byte[] hexStringToByteArray(String hexString)
1537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    {
1547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        int length = hexString.length();
1557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        byte[] buffer = new byte[length / 2];
1567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = 0 ; i < length ; i += 2)
1587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        {
1597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            buffer[i / 2] = (byte)((toByte(hexString.charAt(i)) << 4) | toByte(hexString.charAt(i+1)));
1607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return buffer;
1637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet}
165