private void seekToNextMarker() throws IOException { while (in.getFilePointer() < in.length()) { String check = in.readString(3); if (check.equals(MARKER)) { in.skipBytes(1); return; } in.seek(in.getFilePointer() - 2); } }
@Override public int available() throws IOException { long remain = length() - getFilePointer(); if (remain > Integer.MAX_VALUE) remain = Integer.MAX_VALUE; return (int) remain; }
/** Cut off header bytes from a resource fork file. */ private void stripHeader() throws IOException { in.seek(0); while (!in.readString(4).equals("moov")) { in.seek(in.getFilePointer() - 2); } in.seek(in.getFilePointer() - 8); }
private int findNextOffset(RandomAccessInputStream s, byte[] marker) throws IOException { for (long i=s.getFilePointer(); i<s.length()-marker.length; i++) { s.seek(i); boolean found = true; for (int q=0; q<marker.length; q++) { if (marker[q] != s.readByte()) { found = false; break; } } if (found) return (int) (i + marker.length); } return -1; }
/** Constructs a new TIFF parser from the given input source. */ public TiffParser(RandomAccessInputStream in) { this.in = in; doCaching = true; try { long fp = in.getFilePointer(); checkHeader(); in.seek(fp); } catch (IOException e) { } }
@Override public boolean isThisType(RandomAccessInputStream stream) throws IOException { final int blockLen = 4; if (!FormatTools.validStream(stream, blockLen, false)) return false; stream.order(true); int checkLittleEndian = stream.readInt(); stream.seek(stream.getFilePointer() - 4); stream.order(false); int checkBigEndian = stream.readInt(); return checkLittleEndian == MAGIC || checkBigEndian == MAGIC; }
@Override protected void initFile(String id) throws FormatException, IOException { super.initFile(id); in = new RandomAccessInputStream(id); CoreMetadata m = core.get(0); m.littleEndian = false; findString(DIMENSIONS_STRING); in.skipBytes(DIMENSIONS_STRING.length() + 20); m.sizeX = in.readInt(); m.sizeY = in.readInt(); findString(PIXELS_STRING); pixelOffset = in.getFilePointer() + PIXELS_STRING.length() + 20; m.sizeZ = 1; m.sizeC = 1; m.sizeT = 1; m.imageCount = 1; m.dimensionOrder = "XYCZT"; m.pixelType = FormatTools.FLOAT; MetadataStore store = makeFilterMetadata(); MetadataTools.populatePixels(store, this, true); readExtraMetadata(store); readFileInfoMetadata(store); }
TiffIFDEntry readTiffIFDEntry() throws IOException { int entryTag = in.readUnsignedShort(); // Parse the entry's "Type" IFDType entryType; try { entryType = IFDType.get(in.readUnsignedShort()); } catch (EnumException e) { LOGGER.error("Error reading IFD type at: {}", in.getFilePointer()); throw e; } // Parse the entry's "ValueCount" int valueCount = bigTiff ? (int) in.readLong() : in.readInt(); if (valueCount < 0) { throw new RuntimeException("Count of '" + valueCount + "' unexpected."); } int nValueBytes = valueCount * entryType.getBytesPerElement(); int threshhold = bigTiff ? 8 : 4; long offset = nValueBytes > threshhold ? getNextOffset(0) : in.getFilePointer(); return new TiffIFDEntry(entryTag, entryType, valueCount, offset); } }
private void seekToNextMarker() throws IOException { while (in.getFilePointer() < in.length()) { String check = in.readString(3); if (check.equals(MARKER)) { in.skipBytes(1); return; } in.seek(in.getFilePointer() - 2); } }
private int findNextOffset(RandomAccessInputStream s, byte[] marker) throws IOException { for (long i=s.getFilePointer(); i<s.length()-marker.length; i++) { s.seek(i); boolean found = true; for (int q=0; q<marker.length; q++) { if (marker[q] != s.readByte()) { found = false; break; } } if (found) return (int) (i + marker.length); } return -1; }
@Override public int available() throws IOException { long remain = length() - getFilePointer(); if (remain > Integer.MAX_VALUE) remain = Integer.MAX_VALUE; return (int) remain; }
/** Cut off header bytes from a resource fork file. */ private void stripHeader() throws IOException { in.seek(0); while (!in.readString(4).equals("moov")) { in.seek(in.getFilePointer() - 2); } in.seek(in.getFilePointer() - 8); }
public long get(int index) throws IOException { long fp = stream.getFilePointer(); stream.seek(start + index * 8); long value = stream.readLong(); stream.seek(fp); return value; }
@Override public boolean isThisType(RandomAccessInputStream stream) throws IOException { final int blockLen = 4; if (!FormatTools.validStream(stream, blockLen, false)) return false; stream.order(true); int checkLittleEndian = stream.readInt(); stream.seek(stream.getFilePointer() - 4); stream.order(false); int checkBigEndian = stream.readInt(); return checkLittleEndian == MAGIC || checkBigEndian == MAGIC; }
@Override protected void initFile(String id) throws FormatException, IOException { super.initFile(id); in = new RandomAccessInputStream(id); CoreMetadata m = core.get(0); m.littleEndian = false; findString(DIMENSIONS_STRING); in.skipBytes(DIMENSIONS_STRING.length() + 20); m.sizeX = in.readInt(); m.sizeY = in.readInt(); findString(PIXELS_STRING); pixelOffset = in.getFilePointer() + PIXELS_STRING.length() + 20; m.sizeZ = 1; m.sizeC = 1; m.sizeT = 1; m.imageCount = 1; m.dimensionOrder = "XYCZT"; m.pixelType = FormatTools.FLOAT; MetadataStore store = makeFilterMetadata(); MetadataTools.populatePixels(store, this, true); readExtraMetadata(store); readFileInfoMetadata(store); }
TiffIFDEntry readTiffIFDEntry() throws IOException { int entryTag = in.readUnsignedShort(); // Parse the entry's "Type" IFDType entryType; try { entryType = IFDType.get(in.readUnsignedShort()); } catch (EnumException e) { LOGGER.error("Error reading IFD type at: {}", in.getFilePointer()); throw e; } // Parse the entry's "ValueCount" int valueCount = bigTiff ? (int) in.readLong() : in.readInt(); if (valueCount < 0) { throw new RuntimeException("Count of '" + valueCount + "' unexpected."); } int nValueBytes = valueCount * entryType.getBytesPerElement(); int threshhold = bigTiff ? 8 : 4; long offset = nValueBytes > threshhold ? getNextOffset(0) : in.getFilePointer(); return new TiffIFDEntry(entryTag, entryType, valueCount, offset); } }
protected String parseROIString(RandomAccessInputStream s) throws IOException { // String is 0x0008 followed by int length for string+NUL. while (s.getFilePointer() < s.length() - 4 && s.readShort() != 8); if (s.getFilePointer() >= s.length() - 8) return null; int strlen = s.readInt(); if (strlen + s.getFilePointer() > s.length()) return null; // Strip off NUL. String text = null; if (strlen >= 2) { // Don't read NUL LOGGER.debug(" String@{} length={}", s.getFilePointer(), strlen); text = s.readString(strlen-2); s.skipBytes(2); } else { s.skipBytes(strlen); } return text; }
private void findString(String marker) throws IOException { byte[] buf = new byte[8192]; int overlap = marker.length(); in.read(buf, 0, overlap); while (in.getFilePointer() < in.length()) { int length = in.read(buf, overlap, buf.length - overlap); for (int i=0; i<length; i++) { if (marker.equals( new String(buf, i, marker.length(), Constants.ENCODING))) { in.seek(in.getFilePointer() - (length + overlap) + i); return; } } System.arraycopy(buf, length, buf, 0, overlap); } }
protected void read() throws IOException { blockData = new HashMap<Integer, Object>(); Integer entry = readEntry(); Object value = readValue(); while (value != null && in.getFilePointer() < in.length()) { if (!blockData.containsKey(entry)) blockData.put(entry, value); entry = readEntry(); value = readValue(); } }
@Override public boolean isThisType(RandomAccessInputStream stream) throws IOException { final int blockLen = 4096; if (!FormatTools.validStream(stream, blockLen, false)) return false; TiffParser parser = new TiffParser(stream); if (parser.isValidHeader()) { return parser.getIFDOffsets().length > 1; } stream.seek(4); if (stream.readShort() == 0x5374) { String check = stream.readString((int) (blockLen - stream.getFilePointer())); return check.indexOf("ID") > 0; } return false; }