docs: protected final String toFFDCString(byte[] toDump, int start, int length)
    {
      StringBuffer result = new StringBuffer();
      for (int lineStart = 0; lineStart < length; lineStart += 32)
      {
        int lineEnd = Math.min(lineStart + 32, length);
        StringBuffer hex = new StringBuffer();
        StringBuffer ascii = new StringBuffer();
        for (int i = lineStart; i < lineEnd; i++)
        {
          int b = toDump[start + i];
          b = (b + 256) % 256; // Make sure bytes become unsigned
  
          // Add b to the hex StringBuffer
          int c1 = b / 16;
          int c2 = b % 16;
  
          hex.append((char) (c1 < 10 ? '0' + c1 : 'a' + c1 - 10));
          hex.append((char) (c2 < 10 ? '0' + c2 : 'a' + c2 - 10));
  
          // Add b to the ascii StringBuffer, if printable
          if ((b >= 0x20 && b <= 0x7e))
            ascii.append((char) b);
          else
            ascii.append('.');
          if (i % 32 == 15)
          {
            hex.append("  ");
              ascii.append("  ");
          }
        }
  
        // We need to pad the hex string with sufficient spaces
        // to align the ascii string nicely.
        int pad = 32 - (lineEnd - lineStart);
  
        // This formula aligns to the end of the hex block, plus a
        // trailing space. Honest.
        for (int i = 0; i < pad; i++)
        {
          hex.append("  ");
          if (i % 32 == 16)
          {
            hex.append("  ");
          }
        }
  
        hex.append("   ");
  
        // Before we output the line, output the offset of the
        // start of the line.
        String offset = "0000" + Integer.toHexString(lineStart + start);
        offset = offset.substring(offset.length() - 4);
        result.append(offset);
        result.append(":  ");
  
        // Finally, output the line
        result.append(hex.toString());
        result.append(ascii.toString());
        result.append(lineSeparator);
      }
  
      return result.toString();
    }