/*
* 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
* @version $Revision$
*/
package org.apache.harmony.security.utils;
/**
* Utility class for arrays
*
*/
public class Array {
// No instances of this class
private Array() {
}
public static String getBytesAsString(byte[] data) {
StringBuilder result = new StringBuilder(data.length * 3);
for (int i = 0; i < data.length; ++i) {
result.append(Byte.toHexString(data[i], false));
result.append(' ');
}
return result.toString();
}
/**
* 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 = {
"",
"000",
"00",
"0",
""
};
StringBuilder sb = new StringBuilder();
StringBuilder charForm = new StringBuilder();
int i=0;
for (i=0; i<array.length; i++) {
if (i%16 == 0) {
sb.append(prefix);
// put offset
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
sb.append(Byte.toHexString(array[i], false));
// form character representation part
int currentByte = (0xff & array[i]);
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) {
int ws2add = 16 - i%16;
for (int j=0; j<ws2add; j++) {
sb.append(" ");
}
if (ws2add > 8) {
sb.append(' ');
}
sb.append(" ");
sb.append(charForm.toString());
sb.append('\n');
}
return sb.toString();
}
}