Buggy code:
public class FileEntry { private String longName ; private String shortName ; private String fileExtension ; private FileEntry . Attributes attr ; private int fileCreationTime ; private Date creationDate ; private Date lastAccessedDate ; private long firstCluster ; private Date lastModifiedDate ; private long size ; private FileEntry ( ) { } public static FileEntry getEntry ( String longName , byte [ ] data ) { FileEntry entry = new FileEntry ( ) ; if ( longName != null ) entry . longName = longName ; else entry . longName = "" ; byte [ ] buffer = new byte [ 8 ] ; System . arraycopy ( data , 0 , buffer , 0 , 8 ) ; int length = FileEntry . findNullChar ( buffer ) ; if ( length > 0 ) entry . shortName = new String ( buffer , 0 , length ) ; else entry . shortName = new String ( buffer ) ; System . arraycopy ( data , 8 , buffer , 0 , 3 ) ; entry . fileExtension = new String ( Arrays . copyOf ( buffer , 3 ) ) ; System . arraycopy ( data , 11 , buffer , 0 , 1 ) ; entry . attr = new FileEntry . Attributes ( buffer [ 0 ] ) ; System . arraycopy ( data , 13 , buffer , 0 , 1 ) ; entry . fileCreationTime = buffer [ 0 ] ; System . arraycopy ( data , 14 , buffer , 0 , 2 ) ; int timeData = ( ( buffer [ 0 ] ) << 8 ) + ( buffer [ 1 ] ) ; System . arraycopy ( data , 16 , buffer , 0 , 2 ) ; int dateData = ( ( buffer [ 0 ] ) << 8 ) + ( buffer [ 1 ] ) ; entry . creationDate = FileEntry . parseCreationDate ( dateData , timeData ) ; System . arraycopy ( data , 18 , buffer , 0 , 2 ) ; int accessedDate = ( ( buffer [ 0 ] ) << 8 ) + ( buffer [ 1 ] ) ; entry . lastAccessedDate = FileEntry . parseAccessedDate ( accessedDate ) ; System . arraycopy ( data , 20 , buffer , 0 , 2 ) ; System . arraycopy ( data , 26 , buffer , 2 , 2 ) ; entry . firstCluster = UnsignedUtil . convertBytes2Long ( buffer [ 1 ] , buffer [ 0 ] , buffer [ 3 ] , buffer [ 2 ] ) ; System . arraycopy ( data , 22 , buffer , 0 , 2 ) ; timeData = ( ( buffer [ 0 ] ) << 8 ) + ( buffer [ 1 ] ) ; System . arraycopy ( data , 24 , buffer , 0 , 2 ) ; dateData = ( ( buffer [ 0 ] ) << 8 ) + ( buffer [ 1 ] ) ; entry . lastModifiedDate = FileEntry . parseCreationDate ( dateData , timeData ) ; System . arraycopy ( data , 28 , buffer , 0 , 4 ) ; <START_BUG> entry . size = UnsignedUtil . convertBytes2Long ( buffer [ 0 ] , buffer [ 1 ] , buffer [ 2 ] , buffer [ 3 ] ) ; <END_BUG> return entry ; } private static Date parseCreationDate ( int timeData , int dateData ) { } private static Date parseAccessedDate ( int accessedDate ) { } private static int findNullChar ( byte [ ] data ) { } private static class Attributes { private boolean readOnly ; private boolean hidden ; private boolean system ; private boolean volume ; private boolean directory ; private boolean archive ; public Attributes ( byte attrByte ) { } public boolean isReadOnly ( ) { } public boolean isHidden ( ) { } public boolean isSystem ( ) { } public boolean isVolume ( ) { } public boolean isDirectory ( ) { } public boolean isArchive ( ) { } } public String getLongName ( ) { } public String getShortName ( ) { } public String getFileExtension ( ) { } public int getFileCreationTime ( ) { } public Date getCreationDate ( ) { } public Date getLastAccessedDate ( ) { } public long getFirstCluster ( ) { } public Date getLastModifiedDate ( ) { } public long getSize ( ) { } public boolean isReadOnly ( ) { } public boolean isHidden ( ) { } public boolean isSystem ( ) { } public boolean isVolume ( ) { } public boolean isDirectory ( ) { } public boolean isArchive ( ) { } }

Fix:
entry . size = UnsignedUtil . convertBytes2Long ( buffer [ 3 ] , buffer [ 2 ] , buffer [ 1 ] , buffer [ 0 ] ) ;