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