text: from .py3compat import byte2int, int2byte, bytes2str
  
  
  # Map an integer in the inclusive range 0-255 to its string byte representation
  _printable = {i: "." for i in range(256)}
  _printable.update((i, bytes2str(int2byte(i))) for i in range(32, 128))
  
  
  def hexdump(data, linesize):
      """
      data is a bytes object. The returned result is a string.
      """
      prettylines = []
      fmt = "%%04X   %%-%ds   %%s" if len(data) < 65536 else "%%08X   %%-%ds   %%s"
      fmt %= (3 * linesize - 1,)
      for i in range(0, len(data), linesize):
          line = data[i : i + linesize]
          hextext = " ".join('%02x' % byte2int(b) for b in line)
          rawtext = "".join(_printable[byte2int(b)] for b in line)
          prettylines.append(fmt % (i, str(hextext), str(rawtext)))
      return prettylines
  
  
  class HexString(bytes):
      """
      Represents bytes that will be hex-dumped to a string when its string
      representation is requested.
      """
      def __init__(self, data, linesize = 16):
          self.linesize = linesize
  
      def __new__(cls, data, *args, **kwargs):
          return bytes.__new__(cls, data)
  
      def __str__(self):
          if not self:
              return "''"
          sep = "\n"
          return sep + sep.join(
              hexdump(self, self.linesize))
  