diff --git a/src/read.rs b/src/read.rs index 6d65a3e56..9a489fba3 100644 --- a/src/read.rs +++ b/src/read.rs @@ -1055,15 +1055,17 @@ static HEX0: [i16; 256] = build_hex_table(0); static HEX1: [i16; 256] = build_hex_table(4); fn decode_four_hex_digits(a: u8, b: u8, c: u8, d: u8) -> Option { - let a = HEX1[a as usize]; - let b = HEX0[b as usize]; - let c = HEX1[c as usize]; - let d = HEX0[d as usize]; + let a = HEX1[a as usize] as i32; + let b = HEX0[b as usize] as i32; + let c = HEX1[c as usize] as i32; + let d = HEX0[d as usize] as i32; + + let codepoint = ((a | b) << 8) | c | d; // A single sign bit check. - if (a | b | c | d) < 0 { - return None; + if codepoint >= 0 { + Some(codepoint as u16) + } else { + None } - - Some((((a | b) << 8) | c | d) as u16) }