diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/Codec.java b/src/examples/src/org/apache/poi/poifs/poibrowser/Codec.java deleted file mode 100644 index 76ffe3daf..000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/Codec.java +++ /dev/null @@ -1,240 +0,0 @@ -/* ==================================================================== - 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. -==================================================================== */ - -package org.apache.poi.poifs.poibrowser; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Locale; - -import org.apache.poi.hpsf.ClassID; - -/** - *

Provides utility methods for encoding and decoding hexadecimal - * data.

- * - * @author Rainer Klute (klute@rainer-klute.de) - with portions from Tomcat - */ -public class Codec -{ - - /** - *

The nibbles' hexadecimal values. A nibble is a half byte.

- */ - protected static final byte hexval[] = - {(byte) '0', (byte) '1', (byte) '2', (byte) '3', - (byte) '4', (byte) '5', (byte) '6', (byte) '7', - (byte) '8', (byte) '9', (byte) 'A', (byte) 'B', - (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F'}; - - - - /** - *

Converts a string into its hexadecimal notation.

- */ - public static String hexEncode(final String s) - { - return hexEncode(s.getBytes()); - } - - - - /** - *

Converts a byte array into its hexadecimal notation.

- */ - public static String hexEncode(final byte[] s) - { - return hexEncode(s, 0, s.length); - } - - - - /** - *

Converts a part of a byte array into its hexadecimal - * notation.

- */ - public static String hexEncode(final byte[] s, final int offset, - final int length) - { - StringBuffer b = new StringBuffer(length * 2); - for (int i = offset; i < offset + length; i++) - { - int c = s[i]; - b.append((char) hexval[(c & 0xF0) >> 4]); - b.append((char) hexval[(c & 0x0F) >> 0]); - } - return b.toString(); - } - - - - /** - *

Converts a single byte into its hexadecimal notation.

- */ - public static String hexEncode(final byte b) - { - StringBuffer sb = new StringBuffer(2); - sb.append((char) hexval[(b & 0xF0) >> 4]); - sb.append((char) hexval[(b & 0x0F) >> 0]); - return sb.toString(); - } - - - - /** - *

Converts a short value (16-bit) into its hexadecimal - * notation.

- */ - public static String hexEncode(final short s) - { - StringBuffer sb = new StringBuffer(4); - sb.append((char) hexval[(s & 0xF000) >> 12]); - sb.append((char) hexval[(s & 0x0F00) >> 8]); - sb.append((char) hexval[(s & 0x00F0) >> 4]); - sb.append((char) hexval[(s & 0x000F) >> 0]); - return sb.toString(); - } - - - - /** - *

Converts an int value (32-bit) into its hexadecimal - * notation.

- */ - public static String hexEncode(final int i) - { - StringBuffer sb = new StringBuffer(8); - sb.append((char) hexval[(i & 0xF0000000) >> 28]); - sb.append((char) hexval[(i & 0x0F000000) >> 24]); - sb.append((char) hexval[(i & 0x00F00000) >> 20]); - sb.append((char) hexval[(i & 0x000F0000) >> 16]); - sb.append((char) hexval[(i & 0x0000F000) >> 12]); - sb.append((char) hexval[(i & 0x00000F00) >> 8]); - sb.append((char) hexval[(i & 0x000000F0) >> 4]); - sb.append((char) hexval[(i & 0x0000000F) >> 0]); - return sb.toString(); - } - - - - /** - *

Converts a long value (64-bit) into its hexadecimal - * notation.

- */ - public static String hexEncode(final long l) - { - StringBuffer sb = new StringBuffer(16); - sb.append(hexEncode((int) (l & 0xFFFFFFFF00000000L) >> 32)); - sb.append(hexEncode((int) (l & 0x00000000FFFFFFFFL) >> 0)); - return sb.toString(); - } - - - - /** - *

Converts a class ID into its hexadecimal notation.

- */ - public static String hexEncode(final ClassID classID) - { - return hexEncode(classID.getBytes()); - } - - - - /** - *

Decodes the hexadecimal representation of a sequence of - * bytes into a byte array. Each character in the string - * represents a nibble (half byte) and must be one of the - * characters '0'-'9', 'A'-'F' or 'a'-'f'.

- * - * @param s The string to be decoded - * - * @return The bytes - * - * @throws IllegalArgumentException if the string does not contain - * a valid representation of a byte sequence. - */ - public static byte[] hexDecode(final String s) - { - final int length = s.length(); - - /* The string to be converted must have an even number of - characters. */ - if (length % 2 == 1) - throw new IllegalArgumentException - ("String has odd length " + length); - byte[] b = new byte[length / 2]; - char[] c = new char[length]; - s.toUpperCase(Locale.ROOT).getChars(0, length, c, 0); - for (int i = 0; i < length; i += 2) - b[i/2] = (byte) (decodeNibble(c[i]) << 4 & 0xF0 | - decodeNibble(c[i+1]) & 0x0F); - return b; - } - - - - /** - *

Decodes a nibble.

- * - * @param c A character in the range '0'-'9' or 'A'-'F'. Lower - * case is not supported here. - * - * @return The decoded nibble in the range 0-15 - * - * @throws IllegalArgumentException if c is not a - * permitted character - */ - protected static byte decodeNibble(final char c) - { - for (byte i = 0; i < hexval.length; i++) - if ((byte) c == hexval[i]) - return i; - throw new IllegalArgumentException("\"" + c + "\"" + - " does not represent a nibble."); - } - - - - /** - *

For testing.

- */ - public static void main(final String args[]) - throws IOException - { - final BufferedReader in = - new BufferedReader(new InputStreamReader(System.in)); - String s; - do - { - s = in.readLine(); - if (s != null) - { - String bytes = hexEncode(s); - System.out.print("Hex encoded (String): "); - System.out.println(bytes); - System.out.print("Hex encoded (byte[]): "); - System.out.println(hexEncode(s.getBytes())); - System.out.print("Re-decoded (byte[]): "); - System.out.println(new String(hexDecode(bytes))); - } - } - while (s != null); - } - -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java b/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java index 599ea7cc1..7be745b8f 100644 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java +++ b/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java @@ -21,6 +21,8 @@ import java.awt.*; import javax.swing.*; import javax.swing.tree.*; +import org.apache.poi.util.HexDump; + /** *

{@link TreeCellRenderer} for a {@link DocumentDescriptor}. The * renderer is extremly rudimentary since displays only the document's @@ -34,11 +36,11 @@ public class DocumentDescriptorRenderer extends DefaultTreeCellRenderer public Component getTreeCellRendererComponent(final JTree tree, final Object value, - final boolean selected, + final boolean selectedCell, final boolean expanded, final boolean leaf, final int row, - final boolean hasFocus) + final boolean hasCellFocus) { final DocumentDescriptor d = (DocumentDescriptor) ((DefaultMutableTreeNode) value).getUserObject(); @@ -47,8 +49,9 @@ public class DocumentDescriptorRenderer extends DefaultTreeCellRenderer text.append(renderAsString(d)); text.setFont(new Font("Monospaced", Font.PLAIN, 10)); p.add(text); - if (selected) + if (selectedCell) { Util.invert(text); + } return p; } @@ -58,19 +61,19 @@ public class DocumentDescriptorRenderer extends DefaultTreeCellRenderer */ protected String renderAsString(final DocumentDescriptor d) { - final StringBuffer b = new StringBuffer(); + final StringBuilder b = new StringBuilder(); b.append("Name: "); b.append(d.name); - b.append(" ("); - b.append(Codec.hexEncode(d.name)); - b.append(") \n"); + b.append(" "); + b.append(HexDump.toHex(d.name)); + b.append("\n"); b.append("Size: "); b.append(d.size); b.append(" bytes\n"); b.append("First bytes: "); - b.append(Codec.hexEncode(d.bytes)); + b.append(HexDump.toHex(d.bytes)); return b.toString(); } diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java b/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java index 297fa908c..8f81f5166 100644 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java +++ b/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java @@ -32,6 +32,7 @@ import org.apache.poi.hpsf.Property; import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.Section; import org.apache.poi.hpsf.SummaryInformation; +import org.apache.poi.util.HexDump; /** *

Renders a {@link PropertySetDescriptor} by more or less dumping @@ -59,14 +60,14 @@ public class PropertySetDescriptorRenderer extends DocumentDescriptorRenderer text.setBackground(new Color(200, 255, 200)); text.setFont(new Font("Monospaced", Font.PLAIN, 10)); text.append(renderAsString(d)); - text.append("\nByte order: " + - Codec.hexEncode((short) ps.getByteOrder())); - text.append("\nFormat: " + - Codec.hexEncode((short) ps.getFormat())); - text.append("\nOS version: " + - Codec.hexEncode(ps.getOSVersion())); - text.append("\nClass ID: " + - Codec.hexEncode(ps.getClassID())); + text.append("\nByte order: "); + text.append(HexDump.toHex((short) ps.getByteOrder())); + text.append("\nFormat: "); + text.append(HexDump.toHex((short) ps.getFormat())); + text.append("\nOS version: "); + text.append(HexDump.toHex(ps.getOSVersion())); + text.append("\nClass ID: "); + text.append(HexDump.toHex(ps.getClassID().getBytes())); text.append("\nSection count: " + ps.getSectionCount()); text.append(sectionsToString(ps.getSections())); p.add(text); @@ -132,7 +133,7 @@ public class PropertySetDescriptorRenderer extends DocumentDescriptorRenderer { final StringBuffer b = new StringBuffer(); b.append("\n" + name + " Format ID: "); - b.append(Codec.hexEncode(s.getFormatID())); + b.append(HexDump.toHex(s.getFormatID().getBytes())); b.append("\n" + name + " Offset: " + s.getOffset()); b.append("\n" + name + " Section size: " + s.getSize()); b.append("\n" + name + " Property count: " + s.getPropertyCount()); @@ -153,17 +154,17 @@ public class PropertySetDescriptorRenderer extends DocumentDescriptorRenderer b.append("), Type: "); b.append(type); b.append(", Value: "); - if (value instanceof byte[]) - { - byte[] b2 = (byte[]) value; - b.append("0x" + Codec.hexEncode(b2, 0, 4)); + if (value instanceof byte[]) { + byte[] buf = new byte[4]; + System.arraycopy(value, 0, buf, 0, 4); + b.append(HexDump.toHex(buf)); b.append(' '); - b.append("0x" + Codec.hexEncode(b2, 4, b2.length - 4)); - } - else if (value != null) + System.arraycopy(value, ((byte[])value).length - 4, buf, 0, 4); + } else if (value != null) { b.append(value.toString()); - else + } else { b.append("null"); + } } return b.toString(); } diff --git a/src/java/org/apache/poi/util/HexDump.java b/src/java/org/apache/poi/util/HexDump.java index 7eb8c8506..e72a80ede 100644 --- a/src/java/org/apache/poi/util/HexDump.java +++ b/src/java/org/apache/poi/util/HexDump.java @@ -172,7 +172,8 @@ public class HexDump { if (Character.isISOControl(charB)) return '.'; switch (charB) { - case 0xFF: case 0xDD: // printable, but not compilable with current compiler encoding + // printable, but not compilable with current compiler encoding + case 0xFF: case 0xDD: charB = '.'; break; } @@ -187,7 +188,7 @@ public class HexDump { */ public static String toHex(final byte[] value) { - StringBuffer retVal = new StringBuffer(); + StringBuilder retVal = new StringBuilder(); retVal.append('['); if (value != null && value.length > 0) { @@ -211,7 +212,7 @@ public class HexDump { */ public static String toHex(final short[] value) { - StringBuffer retVal = new StringBuffer(); + StringBuilder retVal = new StringBuilder(); retVal.append('['); for(int x = 0; x < value.length; x++) { @@ -261,7 +262,7 @@ public class HexDump { * @param value The value to convert * @return The result right padded with 0 */ - public static String toHex(final short value) { + public static String toHex(short value) { return xpad(value & 0xFFFF, 4, ""); } @@ -271,7 +272,7 @@ public class HexDump { * @param value The value to convert * @return The result right padded with 0 */ - public static String toHex(final byte value) { + public static String toHex(byte value) { return xpad(value & 0xFF, 2, ""); } @@ -281,7 +282,7 @@ public class HexDump { * @param value The value to convert * @return The result right padded with 0 */ - public static String toHex(final int value) { + public static String toHex(int value) { return xpad(value & 0xFFFFFFFF, 8, ""); } @@ -291,10 +292,22 @@ public class HexDump { * @param value The value to convert * @return The result right padded with 0 */ - public static String toHex(final long value) { - return xpad(value & 0xFFFFFFFF, 16, ""); + public static String toHex(long value) { + return xpad(value, 16, ""); } + /** + * Converts the string to a string of hex values. + * + * @param value The value to convert + * @return The resulted hex string + */ + public static String toHex(String value) { + return (value == null || value.length() == 0) + ? "[]" + : toHex(value.getBytes(LocaleUtil.CHARSET_1252)); + } + /** * Dumps bytesToDump bytes to an output stream. *