private void HandleSegmentReferredToCountAndRententionFlags(SegmentHeader segmentHeader) { short referedToSegmentCountAndRetentionFlags = reader.Readbyte(); int referredToSegmentCount = (referedToSegmentCountAndRetentionFlags & 224) >> 5; // 224 // = // 11100000 short[] retentionFlags = null; /** take off the first three bits of the first byte */ short firstbyte = (short)(referedToSegmentCountAndRetentionFlags & 31); // 31 = // 00011111 if (referredToSegmentCount <= 4) { // short form retentionFlags = new short[1]; retentionFlags[0] = firstbyte; } else if (referredToSegmentCount == 7) { // long form short[] longFormCountAndFlags = new short[4]; /** add the first byte of the four */ longFormCountAndFlags[0] = firstbyte; for (int i = 1; i < 4; i++) { // add the next 3 bytes to the array longFormCountAndFlags[i] = reader.Readbyte(); } /** get the count of the referred to Segments */ referredToSegmentCount = BinaryOperation.GetInt32(longFormCountAndFlags); /** calculate the number of bytes in this field */ int noOfbytesInField = (int)Math.Ceiling(4 + ((referredToSegmentCount + 1) / 8d)); // System.out.println("noOfbytesInField = " + noOfbytesInField); int noOfRententionFlagbytes = noOfbytesInField - 4; retentionFlags = new short[noOfRententionFlagbytes]; reader.Readbyte(retentionFlags); } else { // error //throw new JBIG2Exception("Error, 3 bit Segment count field = " + referredToSegmentCount); } segmentHeader.SetReferredToSegmentCount(referredToSegmentCount); if (JBIG2StreamDecoder.debug) { Console.WriteLine("referredToSegmentCount = " + referredToSegmentCount); } segmentHeader.SetRententionFlags(retentionFlags); if (JBIG2StreamDecoder.debug) { Console.WriteLine("retentionFlags = "); } if (JBIG2StreamDecoder.debug) { for (int i = 0; i < retentionFlags.Length; i++) { Console.WriteLine(retentionFlags[i] + " "); } Console.WriteLine(""); } }