1 package org.djutils.decoderdumper;
2
3 import java.io.IOException;
4
5 /**
6 * Dump bytes as hexadecimal numbers
7 * <p>
8 * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
9 * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
10 * <p>
11 * @version $Revision$, $LastChangedDate$, by $Author$, initial version Jan 3, 2019 <br>
12 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
13 * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
14 * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
15 */
16 public class HexDecoder implements Decoder
17 {
18 /** Prototype output line. */
19 private final String prototypeLine;
20
21 /** Number of fields on an output line. */
22 private int fieldsPerLine;
23
24 /** Insert one extra space every N fields. */
25 private final int extraSpaceAfterEvery;
26
27 /**
28 * Construct a new HexDecoder.
29 * @param fieldsPerLine int; maximum number of hex values on one output line this.extraSpaceAfterEvery =
30 * extraSpaceAfterEvery;
31 * @param extraSpaceAfterEvery int; insert an extra space after every N fields
32 */
33 public HexDecoder(final int fieldsPerLine, final int extraSpaceAfterEvery)
34 {
35 this.fieldsPerLine = fieldsPerLine;
36 this.extraSpaceAfterEvery = extraSpaceAfterEvery > 0 ? extraSpaceAfterEvery : Integer.MAX_VALUE;
37 String format =
38 String.format("%%%ds", fieldsPerLine * 2 + fieldsPerLine - 1 + (fieldsPerLine - 1)
39 / this.extraSpaceAfterEvery);
40 this.prototypeLine = String.format(format, "");
41 }
42
43 /** String builder for current output line. */
44 private StringBuilder buffer = new StringBuilder();
45
46 /** {@inheritDoc} */
47 @Override
48 public String getResult()
49 {
50 String result = this.buffer.toString();
51 this.buffer.setLength(0);
52 return result;
53 }
54
55 /** {@inheritDoc} */
56 @Override
57 public int getMaximumWidth()
58 {
59 return this.prototypeLine.length();
60 }
61
62 /** {@inheritDoc} */
63 @Override
64 public boolean append(int address, byte theByte) throws IOException
65 {
66 if (this.buffer.length() == 0)
67 {
68 this.buffer.append(this.prototypeLine);
69 }
70 int lineByte = address % this.fieldsPerLine;
71 int index = lineByte * 3 + lineByte / this.extraSpaceAfterEvery;
72 this.buffer.replace(index, index + 2, String.format("%02x", theByte));
73 return lineByte == this.fieldsPerLine - 1;
74 }
75
76 /** {@inheritDoc} */
77 @Override
78 public boolean ignoreForIdenticalOutputCheck()
79 {
80 return false;
81 }
82
83 /** {@inheritDoc} */
84 @Override
85 public String toString()
86 {
87 return "HexDecoder [buffer=" + this.buffer + "]";
88 }
89
90 }