diff --git a/src/metadata/cuex.rs b/src/metadata/cuex.rs index 842017e..accc8c4 100644 --- a/src/metadata/cuex.rs +++ b/src/metadata/cuex.rs @@ -153,8 +153,8 @@ pub fn read_nrg_cuex(fd: &mut File) -> Result { fn read_nrg_cuex_track(fd: &mut File) -> Result { let mut track = NrgCuexTrack::new(); track.mode = try!(read_u8(fd)); - track.track_number = try!(read_u8(fd)); - track.index_number = try!(read_u8(fd)); + track.track_number = try!(read_u8_bcd(fd)); + track.index_number = try!(read_u8_bcd(fd)); track.padding = try!(read_u8(fd)); track.position_sectors = try!(read_u32(fd)) as i32; Ok(track) diff --git a/src/metadata/readers.rs b/src/metadata/readers.rs index 45bc410..b35aef7 100644 --- a/src/metadata/readers.rs +++ b/src/metadata/readers.rs @@ -97,3 +97,19 @@ pub fn read_u8(fd: &mut File) -> Result { try!(fd.read_exact(&mut buf)); Ok(buf[0]) } + + +/// Reads a BCD-encoded byte from `fd`. +/// +/// If the decoded value is more than 99, which is not a valid binary-coded +/// decimal value, the byte read is returned as is, without decoding. +pub fn read_u8_bcd(fd: &mut File) -> Result { + let byte = try!(read_u8(fd)); + let tens = (byte >> 4) * 10; + let units = (byte << 4) >> 4; + let value = tens + units; + if value < 100 { + return Ok(value); + } + Ok(byte) +}