Java Code Examples for java.io.DataInputStream#skipBytes()

The following examples show how to use java.io.DataInputStream#skipBytes() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: AddressIndexBlock.java    From RipplePower with Apache License 2.0 6 votes vote down vote up
private static byte[] input(byte[] ins, String name) throws IOException {
	int find = Character.toLowerCase(name.charAt(4));
	ByteArrayInputStream tmp = new ByteArrayInputStream(ins);
	DataInputStream in = new DataInputStream(tmp);
	for (;;) {
		in.readInt();
		int valueLength = in.readInt();
		byte keyBuffer = in.readByte();
		if (keyBuffer == find) {
			byte[] valueBuffer = new byte[valueLength];
			in.read(valueBuffer, 0, valueLength);
			return valueBuffer;
		} else {
			in.skipBytes(valueLength);
		}
	}
}
 
Example 2
Source File: RecorderPlayer.java    From CameraViewer with Apache License 2.0 6 votes vote down vote up
public int getVideoLength() throws IOException {
    int index = 0;
    mDataInputStream = new DataInputStream(new FileInputStream(mFile));
    mFrameLength = new int[1000];
    while (mDataInputStream.available() > 0) {
        int size = mDataInputStream.readInt();//帧长度
        mFrameLength[index++] = mDataInputStream.readInt();//图像停留时间
        mDataInputStream.skipBytes(size);//跳过图像数据
        //空间不够,要扩充
        if (index == mFrameLength.length) {
            int[] tmp = new int[mFrameLength.length + 1000];
            for (int j = 0; j < index; j++) {
                tmp[j] = mFrameLength[j];
            }
            mFrameLength = tmp;
        }
    }
    mDataInputStream.close();
    return index;
}
 
Example 3
Source File: BinaryAttribute.java    From openjdk-8 with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 4
Source File: BinaryAttribute.java    From openjdk-jdk8u-backup with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 5
Source File: BinaryAttribute.java    From jdk8u_jdk with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 6
Source File: BinaryAttribute.java    From jdk8u-jdk with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 7
Source File: BinaryAttribute.java    From jdk8u60 with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 8
Source File: BinaryAttribute.java    From jdk8u-jdk with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 9
Source File: BinaryAttribute.java    From TencentKona-8 with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Load a list of attributes
 */
public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException {
    BinaryAttribute atts = null;
    int natt = in.readUnsignedShort();  // JVM 4.6 method_info.attrutes_count

    for (int i = 0 ; i < natt ; i++) {
        // id from JVM 4.7 attribute_info.attribute_name_index
        Identifier id = cpool.getIdentifier(in.readUnsignedShort());
        // id from JVM 4.7 attribute_info.attribute_length
        int len = in.readInt();

        if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) {
            in.skipBytes(len);
        } else {
            byte data[] = new byte[len];
            in.readFully(data);
            atts = new BinaryAttribute(id, data, atts);
        }
    }
    return atts;
}
 
Example 10
Source File: ServerCutText.java    From cosmic with Apache License 2.0 5 votes vote down vote up
private void readPacketData(final DataInputStream is) throws IOException {
    is.skipBytes(3);// Skip padding
    final int length = is.readInt();
    final byte[] buf = new byte[length];
    is.readFully(buf);

    content = new String(buf, RfbConstants.CHARSET);

    /* LOG */
    s_logger.info("Clippboard content: " + content);
}
 
Example 11
Source File: Util.java    From rscplus with GNU General Public License v3.0 5 votes vote down vote up
public static int getReplayEnding(File replay) {
  int timestamp_ret = 0;

  try {
    DataInputStream fileInput =
        new DataInputStream(
            new BufferedInputStream(new GZIPInputStream(new FileInputStream(replay))));
    for (; ; ) {
      int timestamp_input = fileInput.readInt();

      // EOF
      if (timestamp_input == -1) break;

      // Skip data, we need to find the last timestamp
      int length = fileInput.readInt();
      if (length > 0) {
        int skipped = fileInput.skipBytes(length);

        if (skipped != length) break;
      }

      timestamp_ret = timestamp_input;
    }
    fileInput.close();
  } catch (Exception e) {
    // e.printStackTrace();
  }

  return timestamp_ret;
}
 
Example 12
Source File: HeaderDecoder.java    From healthcare-dicom-dicomweb-adapter with Apache License 2.0 5 votes vote down vote up
/**
    * Reads the PLT fields and realigns the codestream where the next marker
    * should be found. Informations stored in these fields are currently NOT
    * taken into account.
    *
    * @param ehs The encoder header stream.
    *
    * @exception IOException If an I/O error occurs while reading from the
    * encoder header stream
    * */
   private void readPLTFields(DataInputStream ehs) throws IOException{
int length;

length = ehs.readUnsignedShort();
//Ignore all informations contained
ehs.skipBytes(length-2);

       FacilityManager.getMsgLogger().
           printmsg(MsgLogger.INFO,"Skipping unsupported PLT marker");
   }
 
Example 13
Source File: Loader.java    From gravitydefied with GNU General Public License v2.0 5 votes vote down vote up
private void _hIIV(int j, int k) throws InvalidTrackException {
	try {
		InputStream is = getLevelsInputStream("levels.mrg");
		DataInputStream dis = new DataInputStream(is);
		for (int i1 = pointers[j - 1][k - 1]; i1 > 0; i1 -= dis.skipBytes(i1)) ;
		if (levels == null)
			levels = new Level();
		levels.readTrackData(dis);
		dis.close();
		load(levels);
	} catch (IOException _ex) {
		_ex.printStackTrace();
	}
}
 
Example 14
Source File: ImageLoaderCurrent.java    From hadoop with Apache License 2.0 5 votes vote down vote up
/**
 * Process the blocks section of the fsimage.
 *
 * @param in Datastream to process
 * @param v Visitor to walk over inodes
 * @param skipBlocks Walk over each block?
 */
private void processBlocks(DataInputStream in, ImageVisitor v,
    int numBlocks, boolean skipBlocks) throws IOException {
  v.visitEnclosingElement(ImageElement.BLOCKS,
                          ImageElement.NUM_BLOCKS, numBlocks);
  
  // directory or symlink or reference node, no blocks to process    
  if(numBlocks < 0) { 
    v.leaveEnclosingElement(); // Blocks
    return;
  }
  
  if(skipBlocks) {
    int bytesToSkip = ((Long.SIZE * 3 /* fields */) / 8 /*bits*/) * numBlocks;
    if(in.skipBytes(bytesToSkip) != bytesToSkip)
      throw new IOException("Error skipping over blocks");
    
  } else {
    for(int j = 0; j < numBlocks; j++) {
      v.visitEnclosingElement(ImageElement.BLOCK);
      v.visit(ImageElement.BLOCK_ID, in.readLong());
      v.visit(ImageElement.NUM_BYTES, in.readLong());
      v.visit(ImageElement.GENERATION_STAMP, in.readLong());
      v.leaveEnclosingElement(); // Block
    }
  }
  v.leaveEnclosingElement(); // Blocks
}
 
Example 15
Source File: HeaderDecoder.java    From healthcare-dicom-dicomweb-adapter with Apache License 2.0 5 votes vote down vote up
/**
 * Reads a COM marker segments and realigns the bit stream at the point
 * where the next marker segment should be found. COM is an informational
 * marker segment that allows to include unstructured data in the main and
 * tile-part headers.
 *
 * @param ehs The encoded header stream
 *
 * @param mainh Flag indicating whether or not this marker segment is read
 * from the main header.
 *
 * @param tileIdx The index of the current tile
 *
 * @param comIdx Occurence of this COM marker in eith main or tile-part
 * header 
 * 
 * @exception IOException If an I/O error occurs while reading from the
 * encoded header stream
 * */
private void readCOM (DataInputStream ehs, boolean mainh, int tileIdx,
                      int comIdx) throws IOException {
    HeaderInfo.COM ms = hi.getNewCOM();

    // Read length of COM field
    ms.lcom = ehs.readUnsignedShort();

    // Read the registration value of the COM marker segment
    ms.rcom = ehs.readUnsignedShort();
    switch(ms.rcom) {
    case RCOM_GEN_USE:
        ms.ccom = new byte[ms.lcom-4];
        for(int i=0; i<ms.lcom-4; i++) {
            ms.ccom[i] = ehs.readByte();
        }
        break;
    default:
        // --- Unknown or unsupported markers ---
        // (skip them and see if we can get way with it)
        FacilityManager.getMsgLogger().
            printmsg(MsgLogger.WARNING,
                     "COM marker registered as 0x"+Integer.
                     toHexString(ms.rcom)+
                     " unknown, ignoring (this might crash the "+
                     "decoder or decode a quality degraded or even "+
                     "useless image)");
        ehs.skipBytes(ms.lcom-4); //Ignore this field for the moment
        break;
    }

    if (mainh) {
        hi.com.put("main_"+comIdx,ms);
    } else {
        hi.com.put("t"+tileIdx+"_"+comIdx,ms);
    }

    // Check marker length
    checkMarkerLength(ehs,"COM marker");
}
 
Example 16
Source File: ImageLoaderCurrent.java    From big-c with Apache License 2.0 5 votes vote down vote up
/**
 * Process the blocks section of the fsimage.
 *
 * @param in Datastream to process
 * @param v Visitor to walk over inodes
 * @param skipBlocks Walk over each block?
 */
private void processBlocks(DataInputStream in, ImageVisitor v,
    int numBlocks, boolean skipBlocks) throws IOException {
  v.visitEnclosingElement(ImageElement.BLOCKS,
                          ImageElement.NUM_BLOCKS, numBlocks);
  
  // directory or symlink or reference node, no blocks to process    
  if(numBlocks < 0) { 
    v.leaveEnclosingElement(); // Blocks
    return;
  }
  
  if(skipBlocks) {
    int bytesToSkip = ((Long.SIZE * 3 /* fields */) / 8 /*bits*/) * numBlocks;
    if(in.skipBytes(bytesToSkip) != bytesToSkip)
      throw new IOException("Error skipping over blocks");
    
  } else {
    for(int j = 0; j < numBlocks; j++) {
      v.visitEnclosingElement(ImageElement.BLOCK);
      v.visit(ImageElement.BLOCK_ID, in.readLong());
      v.visit(ImageElement.NUM_BYTES, in.readLong());
      v.visit(ImageElement.GENERATION_STAMP, in.readLong());
      v.leaveEnclosingElement(); // Block
    }
  }
  v.leaveEnclosingElement(); // Blocks
}
 
Example 17
Source File: ICUBinary.java    From openjdk-jdk8u with GNU General Public License v2.0 4 votes vote down vote up
/**
* <p>ICU data header reader method.
* Takes a ICU generated big-endian input stream, parse the ICU standard
* file header and authenticates them.</p>
* <p>Header format:
* <ul>
*     <li> Header size (char)
*     <li> Magic number 1 (byte)
*     <li> Magic number 2 (byte)
*     <li> Rest of the header size (char)
*     <li> Reserved word (char)
*     <li> Big endian indicator (byte)
*     <li> Character set family indicator (byte)
*     <li> Size of a char (byte) for c++ and c use
*     <li> Reserved byte (byte)
*     <li> Data format identifier (4 bytes), each ICU data has its own
*          identifier to distinguish them. [0] major [1] minor
*                                          [2] milli [3] micro
*     <li> Data version (4 bytes), the change version of the ICU data
*                             [0] major [1] minor [2] milli [3] micro
*     <li> Unicode version (4 bytes) this ICU is based on.
* </ul>
* </p>
* <p>
* Example of use:<br>
* <pre>
* try {
*    FileInputStream input = new FileInputStream(filename);
*    If (Utility.readICUDataHeader(input, dataformat, dataversion,
*                                  unicode) {
*        System.out.println("Verified file header, this is a ICU data file");
*    }
* } catch (IOException e) {
*    System.out.println("This is not a ICU data file");
* }
* </pre>
* </p>
* @param inputStream input stream that contains the ICU data header
* @param dataFormatIDExpected Data format expected. An array of 4 bytes
*                     information about the data format.
*                     E.g. data format ID 1.2.3.4. will became an array of
*                     {1, 2, 3, 4}
* @param authenticate user defined extra data authentication. This value
*                     can be null, if no extra authentication is needed.
* @exception IOException thrown if there is a read error or
*            when header authentication fails.
* @draft 2.1
*/
public static final byte[] readHeader(InputStream inputStream,
                                    byte dataFormatIDExpected[],
                                    Authenticate authenticate)
                                                      throws IOException
{
    DataInputStream input = new DataInputStream(inputStream);
    char headersize = input.readChar();
    int readcount = 2;
    //reading the header format
    byte magic1 = input.readByte();
    readcount ++;
    byte magic2 = input.readByte();
    readcount ++;
    if (magic1 != MAGIC1 || magic2 != MAGIC2) {
        throw new IOException(MAGIC_NUMBER_AUTHENTICATION_FAILED_);
    }

    input.readChar(); // reading size
    readcount += 2;
    input.readChar(); // reading reserved word
    readcount += 2;
    byte bigendian    = input.readByte();
    readcount ++;
    byte charset      = input.readByte();
    readcount ++;
    byte charsize     = input.readByte();
    readcount ++;
    input.readByte(); // reading reserved byte
    readcount ++;

    byte dataFormatID[] = new byte[4];
    input.readFully(dataFormatID);
    readcount += 4;
    byte dataVersion[] = new byte[4];
    input.readFully(dataVersion);
    readcount += 4;
    byte unicodeVersion[] = new byte[4];
    input.readFully(unicodeVersion);
    readcount += 4;
    if (headersize < readcount) {
        throw new IOException("Internal Error: Header size error");
    }
    input.skipBytes(headersize - readcount);

    if (bigendian != BIG_ENDIAN_ || charset != CHAR_SET_
        || charsize != CHAR_SIZE_
        || !Arrays.equals(dataFormatIDExpected, dataFormatID)
        || (authenticate != null
            && !authenticate.isDataVersionAcceptable(dataVersion))) {
        throw new IOException(HEADER_AUTHENTICATION_FAILED_);
    }
    return unicodeVersion;
}
 
Example 18
Source File: SMFTools.java    From computoser with GNU Affero General Public License v3.0 4 votes vote down vote up
/**
 * Reads a MIDI track chunk
 *
 * @param DataInputStream
 *            dis - the input stream to read from
 * @exception IOException
 */
private void readTrackChunk(DataInputStream dis) throws IOException {
    // local variables for Track class
    Track track = new Track();
    // Insert new Track into a list of tracks
    this.trackList.addElement(track);
    int deltaTime = 0;
    // Read track header
    if (dis.readInt() != 0x4D54726B) {// If MTrk read is wrong
        throw new IOException("Track started in wrong place!!!!  ABORTING");
    } else {// If MTrk read ok get bytesRemaining
        dis.readInt();
    }
    // loop variables
    int status, oldStatus = 0, eventLength = 0;
    // Start gathering event data
    Event event = null;
    while (true) {
        try {
            // get variable length timestamp
            deltaTime = MidiUtil.readVarLength(dis);
            // mark stream so we can return if we need running status
            dis.mark(2);
            status = dis.readUnsignedByte();
            // decide on running status
            if (status < 0x80) { // set running status
                status = oldStatus;
                // return stream to before status read
                dis.reset();
            }
            // create default event of correct type
            if (status >= 0xFF) { // Meta Event
                int type = dis.readUnsignedByte();
                eventLength = MidiUtil.readVarLength(dis);
                event = jm.midi.MidiUtil.createMetaEvent(type);
            } else if (status >= 0xF0) { // System Exclusive --- NOT
                                         // SUPPORTED
                eventLength = MidiUtil.readVarLength(dis);
            } else if (status >= 0x80) { // MIDI voice event
                short selection = (short) (status / 0x10);
                short midiChannel = (short) (status - (selection * 0x10));
                VoiceEvt evt = (VoiceEvt) MidiUtil.createVoiceEvent(selection);
                if (evt == null) {
                    throw new IOException("MIDI file read error: invalid voice event type!");
                }
                evt.setMidiChannel(midiChannel);
                event = evt;
            }
            oldStatus = status;
        } catch (EOFException ex) {
            logger.warn("EOFException (" + ex.getMessage() + ") encountered in SMFTools");
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
        if (event != null) {
            // read data into the new event and
            // add the new event to the Track object
            event.setTime(deltaTime);
            event.read(dis);
            track.addEvent(event);
            // event.print();
            if (event instanceof EndTrack)
                break;
        } else {
            // skip the stream ahead to next valid event
            dis.skipBytes(eventLength);
        }
    }
}
 
Example 19
Source File: FramebufferUpdatePacket.java    From cosmic with Apache License 2.0 4 votes vote down vote up
private void readPacketData(final DataInputStream is) throws IOException {
    is.skipBytes(1);// Skip padding

    // Read number of rectangles
    final int numberOfRectangles = is.readUnsignedShort();

    // For all rectangles
    for (int i = 0; i < numberOfRectangles; i++) {

        // Read coordinate of rectangle
        final int x = is.readUnsignedShort();
        final int y = is.readUnsignedShort();
        final int width = is.readUnsignedShort();
        final int height = is.readUnsignedShort();

        final int encodingType = is.readInt();

        // Process rectangle
        final Rect rect;
        switch (encodingType) {

            case RfbConstants.ENCODING_RAW: {
                rect = new RawRect(this.screen, x, y, width, height, is);
                break;
            }

            case RfbConstants.ENCODING_COPY_RECT: {
                rect = new CopyRect(x, y, width, height, is);
                break;
            }

            case RfbConstants.ENCODING_DESKTOP_SIZE: {
                rect = new FrameBufferSizeChangeRequest(this.canvas, width, height);
                if (this.clientListener != null) {
                    this.clientListener.onFramebufferSizeChange(width, height);
                }
                break;
            }

            default:
                throw new RuntimeException("Unsupported ecnoding: " + encodingType);
        }

        paint(rect, this.canvas);

        if (this.clientListener != null) {
            this.clientListener.onFramebufferUpdate(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
        }
    }
}
 
Example 20
Source File: ICUBinary.java    From openjdk-8-source with GNU General Public License v2.0 4 votes vote down vote up
/**
* <p>ICU data header reader method.
* Takes a ICU generated big-endian input stream, parse the ICU standard
* file header and authenticates them.</p>
* <p>Header format:
* <ul>
*     <li> Header size (char)
*     <li> Magic number 1 (byte)
*     <li> Magic number 2 (byte)
*     <li> Rest of the header size (char)
*     <li> Reserved word (char)
*     <li> Big endian indicator (byte)
*     <li> Character set family indicator (byte)
*     <li> Size of a char (byte) for c++ and c use
*     <li> Reserved byte (byte)
*     <li> Data format identifier (4 bytes), each ICU data has its own
*          identifier to distinguish them. [0] major [1] minor
*                                          [2] milli [3] micro
*     <li> Data version (4 bytes), the change version of the ICU data
*                             [0] major [1] minor [2] milli [3] micro
*     <li> Unicode version (4 bytes) this ICU is based on.
* </ul>
* </p>
* <p>
* Example of use:<br>
* <pre>
* try {
*    FileInputStream input = new FileInputStream(filename);
*    If (Utility.readICUDataHeader(input, dataformat, dataversion,
*                                  unicode) {
*        System.out.println("Verified file header, this is a ICU data file");
*    }
* } catch (IOException e) {
*    System.out.println("This is not a ICU data file");
* }
* </pre>
* </p>
* @param inputStream input stream that contains the ICU data header
* @param dataFormatIDExpected Data format expected. An array of 4 bytes
*                     information about the data format.
*                     E.g. data format ID 1.2.3.4. will became an array of
*                     {1, 2, 3, 4}
* @param authenticate user defined extra data authentication. This value
*                     can be null, if no extra authentication is needed.
* @exception IOException thrown if there is a read error or
*            when header authentication fails.
* @draft 2.1
*/
public static final byte[] readHeader(InputStream inputStream,
                                    byte dataFormatIDExpected[],
                                    Authenticate authenticate)
                                                      throws IOException
{
    DataInputStream input = new DataInputStream(inputStream);
    char headersize = input.readChar();
    int readcount = 2;
    //reading the header format
    byte magic1 = input.readByte();
    readcount ++;
    byte magic2 = input.readByte();
    readcount ++;
    if (magic1 != MAGIC1 || magic2 != MAGIC2) {
        throw new IOException(MAGIC_NUMBER_AUTHENTICATION_FAILED_);
    }

    input.readChar(); // reading size
    readcount += 2;
    input.readChar(); // reading reserved word
    readcount += 2;
    byte bigendian    = input.readByte();
    readcount ++;
    byte charset      = input.readByte();
    readcount ++;
    byte charsize     = input.readByte();
    readcount ++;
    input.readByte(); // reading reserved byte
    readcount ++;

    byte dataFormatID[] = new byte[4];
    input.readFully(dataFormatID);
    readcount += 4;
    byte dataVersion[] = new byte[4];
    input.readFully(dataVersion);
    readcount += 4;
    byte unicodeVersion[] = new byte[4];
    input.readFully(unicodeVersion);
    readcount += 4;
    if (headersize < readcount) {
        throw new IOException("Internal Error: Header size error");
    }
    input.skipBytes(headersize - readcount);

    if (bigendian != BIG_ENDIAN_ || charset != CHAR_SET_
        || charsize != CHAR_SIZE_
        || !Arrays.equals(dataFormatIDExpected, dataFormatID)
        || (authenticate != null
            && !authenticate.isDataVersionAcceptable(dataVersion))) {
        throw new IOException(HEADER_AUTHENTICATION_FAILED_);
    }
    return unicodeVersion;
}