Unified · Split
| @@ -10,7 +10,7 @@ const N64_SIZE: usize = size_of::<u64>(); · 9 unmodified lines | |||
| 10 | const FAN_LEN: usize = 256; | 10 | const FAN_LEN: usize = 256; |
| 11 | const V1_HEADER_SIZE: usize = FAN_LEN * N32_SIZE; | 11 | const V1_HEADER_SIZE: usize = FAN_LEN * N32_SIZE; |
| 12 | const V2_HEADER_SIZE: usize = N32_SIZE * 2 + FAN_LEN * N32_SIZE; | 12 | const V2_HEADER_SIZE: usize = N32_SIZE * 2 + FAN_LEN * N32_SIZE; |
| 13 | const MAX_N31: u32 = u32::max_value() >> 1; | 13 | const N32_HIGH_BIT: u32 = 1 << 31; |
| 14 | 14 | ||
| 15 | quick_error! { | 15 | quick_error! { |
| 16 | #[derive(Debug)] | 16 | #[derive(Debug)] |
| @@ -115,8 +115,8 @@ impl File { · 98 unmodified lines | |||
| 115 | oid: object::id_from_20_bytes(oid), | 115 | oid: object::id_from_20_bytes(oid), |
| 116 | offset: { | 116 | offset: { |
| 117 | let ofs32 = BigEndian::read_u32(ofs32); | 117 | let ofs32 = BigEndian::read_u32(ofs32); |
| 118 | if ofs32 > MAX_N31 { | 118 | if (ofs32 & N32_HIGH_BIT) == N32_HIGH_BIT { |
| 119 | let from = pack64_offset + (ofs32 ^ 0b10000000_00000000_00000000_00000000) as usize * N64_SIZE; | 119 | let from = pack64_offset + (ofs32 ^ N32_HIGH_BIT) as usize * N64_SIZE; |
| 120 | BigEndian::read_u64(&self.data[from..from + N64_SIZE]) | 120 | BigEndian::read_u64(&self.data[from..from + N64_SIZE]) |
| 121 | } else { | 121 | } else { |
| 122 | ofs32 as u64 | 122 | ofs32 as u64 |