code: public static void decodeTo(byte[] data, int offset, int length, MultiMap map, String charset)
      {
          if (data == null || length == 0)
              return;
  
          if (charset==null)
              charset=StringUtil.__ISO_8859_1;
          
          synchronized(map)
          {
              try
              {
                  int    ix = offset;
                  int    end = offset+length;
                  int    ox = offset;
                  String key = null;
                  String value = null;
                  while (ix < end)
                  {
                      byte c = data[ix++];
                      switch ((char) c)
                      {
                        case '&':
                            value = new String(data, offset, ox, charset);
                            if (key != null)
                            {
                                map.add(key,value);
                                key = null;
                            }
                            ox = offset;
                            break;
                        case '=':
                            if (key!=null)
                                break;
                            key = new String(data, offset, ox, charset);
                            ox = offset;
                            break;
                        case '+':
                            data[ox++] = (byte)' ';
                            break;
                        case '%':
                            int i0 = (14<<4)+1;
                            byte b0 = (byte)i0;
                            data[ox++] = (byte)
                                ((TypeUtil.convertHexDigit(data[ix++]) << 4)+
                                 TypeUtil.convertHexDigit(data[ix++]));
                            break;
                        default:
                            data[ox++] = c;
                      }
                  }
                  if (key != null)
                  {
                      value = new String(data, offset, ox, charset);
                      map.add(key,value);
                  }
              }
              catch(UnsupportedEncodingException e)
              {
                  log.warn(LogSupport.EXCEPTION,e);
              }
          }
      }
docs: Decoded parameters to Map.
  @param data the byte[] containing the encoded parameters