diff --git a/v2/ifd_enumerate.go b/v2/ifd_enumerate.go
index 1359333..ed8b805 100644
--- a/v2/ifd_enumerate.go
+++ b/v2/ifd_enumerate.go
@@ -77,6 +77,7 @@ type byteParser struct {
 	byteOrder       binary.ByteOrder
 	addressableData []byte
 	ifdOffset       uint32
+	buffer          *bytes.Buffer
 	currentOffset   uint32
 }
 
@@ -90,6 +91,7 @@ func newByteParser(addressableData []byte, byteOrder binary.ByteOrder, ifdOffset
 	bp = &byteParser{
 		addressableData: addressableData,
 		byteOrder:       byteOrder,
+		buffer:          bytes.NewBuffer(addressableData[ifdOffset:]),
 		currentOffset:   ifdOffset,
 	}
 
@@ -109,12 +111,16 @@ func (bp *byteParser) getUint16() (value uint16, raw []byte, err error) {
 	// TODO(dustin): Add test
 
 	needBytes := 2
+	offset := 0
+	raw = make([]byte, needBytes)
 
-	if bp.currentOffset+needBytes >= len(bp.addressableData) {
-		return 0, nil, io.EOF
+	for offset < needBytes {
+		n, err := bp.buffer.Read(raw[offset:])
+		log.PanicIf(err)
+
+		offset += n
 	}
 
-	raw = addressableData[bp.currentOffset : bp.currentOffset+needBytes]
 	value = bp.byteOrder.Uint16(raw)
 
 	bp.currentOffset += uint32(needBytes)
@@ -135,13 +141,17 @@ func (bp *byteParser) getUint32() (value uint32, raw []byte, err error) {
 	// TODO(dustin): Add test
 
 	needBytes := 4
+	offset := 0
+	raw = make([]byte, needBytes)
 
-	if bp.currentOffset+needBytes >= len(bp.addressableData) {
-		return 0, nil, io.EOF
+	for offset < needBytes {
+		n, err := bp.buffer.Read(raw[offset:])
+		log.PanicIf(err)
+
+		offset += n
 	}
 
-	raw = addressableData[bp.currentOffset : bp.currentOffset+needBytes]
-	value = bp.byteOrder.Uint16(raw)
+	value = bp.byteOrder.Uint32(raw)
 
 	bp.currentOffset += uint32(needBytes)
 
@@ -158,6 +168,7 @@ func (bp *byteParser) CurrentOffset() uint32 {
 // containers in the EXIF blob.
 type IfdEnumerate struct {
 	exifData       []byte
+	buffer         *bytes.Buffer
 	byteOrder      binary.ByteOrder
 	tagIndex       *TagIndex
 	ifdMapping     *exifcommon.IfdMapping
@@ -168,6 +179,7 @@ type IfdEnumerate struct {
 func NewIfdEnumerate(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, byteOrder binary.ByteOrder) *IfdEnumerate {
 	return &IfdEnumerate{
 		exifData:   exifData,
+		buffer:     bytes.NewBuffer(exifData),
 		byteOrder:  byteOrder,
 		ifdMapping: ifdMapping,
 		tagIndex:   tagIndex,