code: public byte[] toByteArray() {
  	// All bytes are automatically set to 0
  	byte[] p = new byte[48];
  
  	p[0] = (byte) (leapIndicator << 6 | version << 3 | mode);
  	p[1] = (byte) stratum;
  	p[2] = pollInterval;
  	p[3] = precision;
  
  	// root delay is a signed 16.16-bit FP, in Java an int is 32-bits
  	int l = (int) (rootDelay * 65536.0);
  	p[4] = (byte) ((l >> 24) & 0xFF);
  	p[5] = (byte) ((l >> 16) & 0xFF);
  	p[6] = (byte) ((l >> 8) & 0xFF);
  	p[7] = (byte) (l & 0xFF);
  
  	// root dispersion is an unsigned 16.16-bit FP, in Java there are no
  	// unsigned primitive types, so we use a long which is 64-bits
  	long ul = (long) (rootDispersion * 65536.0);
  	p[8] = (byte) ((ul >> 24) & 0xFF);
  	p[9] = (byte) ((ul >> 16) & 0xFF);
  	p[10] = (byte) ((ul >> 8) & 0xFF);
  	p[11] = (byte) (ul & 0xFF);
  
  	p[12] = referenceIdentifier[0];
  	p[13] = referenceIdentifier[1];
  	p[14] = referenceIdentifier[2];
  	p[15] = referenceIdentifier[3];
  
  	encodeTimestamp(p, 16, referenceTimestamp);
  	encodeTimestamp(p, 24, originateTimestamp);
  	encodeTimestamp(p, 32, receiveTimestamp);
  	encodeTimestamp(p, 40, transmitTimestamp);
  
  	return p;
      }
docs: This method constructs the data bytes of a raw NTP packet.
  
  @return