diff options
author | Makoto Onuki <omakoto@google.com> | 2012-03-23 13:55:37 -0700 |
---|---|---|
committer | Makoto Onuki <omakoto@google.com> | 2012-03-23 14:03:21 -0700 |
commit | 81567f4a0f7c9c338506bd82f4d33e83c2ccf159 (patch) | |
tree | 79caaabb662456f9ab46fd886dab0d17cba17962 /src/com/android/providers/contacts/util | |
parent | d3256d7ba4ee8376567f91c1c2dec444ad13d542 (diff) | |
download | packages_providers_ContactsProvider-81567f4a0f7c9c338506bd82f4d33e83c2ccf159.zip packages_providers_ContactsProvider-81567f4a0f7c9c338506bd82f4d33e83c2ccf159.tar.gz packages_providers_ContactsProvider-81567f4a0f7c9c338506bd82f4d33e83c2ccf159.tar.bz2 |
Add new package aggregation.util
Move aggregator related classes into it.
Change-Id: I712fe07ad2bab1e532e3822e3e2797a199329865
Diffstat (limited to 'src/com/android/providers/contacts/util')
-rw-r--r-- | src/com/android/providers/contacts/util/Hex.java | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/com/android/providers/contacts/util/Hex.java b/src/com/android/providers/contacts/util/Hex.java new file mode 100644 index 0000000..ad26f4b --- /dev/null +++ b/src/com/android/providers/contacts/util/Hex.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.providers.contacts.util; + +/** + * Basic hex operations: from byte array to string and vice versa. + * + * TODO: move to the framework and consider implementing as native code. + */ +public class Hex { + + private static final char[] HEX_DIGITS = new char[]{ + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + private static final char[] FIRST_CHAR = new char[256]; + private static final char[] SECOND_CHAR = new char[256]; + static { + for (int i = 0; i < 256; i++) { + FIRST_CHAR[i] = HEX_DIGITS[(i >> 4) & 0xF]; + SECOND_CHAR[i] = HEX_DIGITS[i & 0xF]; + } + } + + private static final byte[] DIGITS = new byte['f'+1]; + static { + for (int i = 0; i <= 'F'; i++) { + DIGITS[i] = -1; + } + for (byte i = 0; i < 10; i++) { + DIGITS['0' + i] = i; + } + for (byte i = 0; i < 6; i++) { + DIGITS['A' + i] = (byte)(10 + i); + DIGITS['a' + i] = (byte)(10 + i); + } + } + + /** + * Quickly converts a byte array to a hexadecimal string representation. + * + * @param array byte array, possibly zero-terminated. + */ + public static String encodeHex(byte[] array, boolean zeroTerminated) { + char[] cArray = new char[array.length * 2]; + + int j = 0; + for (int i = 0; i < array.length; i++) { + int index = array[i] & 0xFF; + if (zeroTerminated && index == 0 && i == array.length-1) { + break; + } + + cArray[j++] = FIRST_CHAR[index]; + cArray[j++] = SECOND_CHAR[index]; + } + + return new String(cArray, 0, j); + } + + /** + * Quickly converts a hexadecimal string to a byte array. + */ + public static byte[] decodeHex(String hexString) { + int length = hexString.length(); + + if ((length & 0x01) != 0) { + throw new IllegalArgumentException("Odd number of characters."); + } + + boolean badHex = false; + byte[] out = new byte[length >> 1]; + for (int i = 0, j = 0; j < length; i++) { + int c1 = hexString.charAt(j++); + if (c1 > 'f') { + badHex = true; + break; + } + + final byte d1 = DIGITS[c1]; + if (d1 == -1) { + badHex = true; + break; + } + + int c2 = hexString.charAt(j++); + if (c2 > 'f') { + badHex = true; + break; + } + + final byte d2 = DIGITS[c2]; + if (d2 == -1) { + badHex = true; + break; + } + + out[i] = (byte) (d1 << 4 | d2); + } + + if (badHex) { + throw new IllegalArgumentException("Invalid hexadecimal digit: " + hexString); + } + + return out; + } +} |