/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ /** * @author Vladimir N. Molotkov */ package org.apache.harmony.security.utils; /** * Utility class for arrays * */ public class Array { /** * Represents <code>array</code> as <code>String</code> for printing. Array * length can be up to 32767 * * @param array * to be represented as <code>String</code> * * @return <code>String</code> representation of the <code>array</code> */ public static String toString(byte[] array, String prefix) { // Prefixes to be added to the offset values // in <code>String toString(byte[], String)</code> method final String[] offsetPrefix = { "", //$NON-NLS-1$ "000", //$NON-NLS-1$ "00", //$NON-NLS-1$ "0", //$NON-NLS-1$ "" //$NON-NLS-1$ }; final StringBuilder sb = new StringBuilder(); final StringBuilder charForm = new StringBuilder(); int i = 0; for (i = 0; i < array.length; i++) { if (i % 16 == 0) { sb.append(prefix); // put offset final String offset = Integer.toHexString(i); sb.append(offsetPrefix[offset.length()]); sb.append(offset); // clear char form for new line charForm.delete(0, charForm.length()); } // put delimiter sb.append(' '); // put current byte final int currentByte = (0xff & array[i]); final String hexTail = Integer.toHexString(currentByte); if (hexTail.length() == 1) { sb.append('0'); } sb.append(hexTail); // form character representation part final char currentChar = (char) (currentByte & 0xffff); // FIXME if needed (how to distinguish PRINTABLE chars?) charForm.append((Character.isISOControl(currentChar) ? '.' : currentChar)); // Add additional delimiter for each 8 values if ((i + 1) % 8 == 0) { sb.append(' '); } // Add character representation for each line if ((i + 1) % 16 == 0) { sb.append(' '); sb.append(charForm.toString()); sb.append('\n'); } } // form last line if (i % 16 != 0) { final int ws2add = 16 - i % 16; for (int j = 0; j < ws2add; j++) { sb.append(" "); //$NON-NLS-1$ } if (ws2add > 8) { sb.append(' '); } sb.append(" "); //$NON-NLS-1$ sb.append(charForm.toString()); sb.append('\n'); } return sb.toString(); } // No instances of this class private Array() { } }