View Javadoc
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  }