code: public int readTag() throws IOException {
  		byte b = (byte) this.read();
  
  		this.tagClass = (b & Tag.CLASS_MASK) >> 6;
  		this.pCBit = (b & Tag.PC_MASK) >> 5;
  
  		this.tag = b & Tag.TAG_MASK;
  
  		// For larger tag values, the first octet has all ones in bits 5 to 1,
  		// and the tag value is then encoded in
  		// as many following octets as are needed, using only the least
  		// significant seven bits of each octet,
  		// and using the minimum number of octets for the encoding. The most
  		// significant bit (the "more"
  		// bit) is set to 1 in the first following octet, and to zero in the
  		// last.
  		if (tag == Tag.TAG_MASK) {
  			byte temp;
  			tag = 0;
  			do {
  				temp = (byte) this.read();
  				tag = (tag << 7) | (0x7F & temp);
  			} while (0 != (0x80 & temp));
  		}
  
  		return tag;
  	}
docs: Reads the tag field. Returns the tag value.
  Tag class and primitive / constructive mark can be get then by getTagClass() and isTagPrimitive() methods
  
  @return
  @throws IOException