feat: remove zeroed vector by pushing front
This commit is contained in:
parent
b4bda00141
commit
a050618fd8
|
@ -69,7 +69,7 @@ static BASE58_DIGITS: [Option<u8>; 128] = [
|
|||
/// Decodes a base58-encoded string into a byte vector.
|
||||
pub fn decode(data: &str) -> Result<Vec<u8>, InvalidCharacterError> {
|
||||
// 11/15 is just over log_256(58)
|
||||
let mut scratch = vec![0u8; 1 + data.len() * 11 / 15];
|
||||
let mut scratch = Vec::with_capacity(1 + data.len() * 11 / 15);
|
||||
// Build in base 256
|
||||
for d58 in data.bytes() {
|
||||
// Compute "X = X * 58 + next_digit" in base 256
|
||||
|
@ -82,18 +82,25 @@ pub fn decode(data: &str) -> Result<Vec<u8>, InvalidCharacterError> {
|
|||
return Err(InvalidCharacterError { invalid: d58 });
|
||||
}
|
||||
};
|
||||
for d256 in scratch.iter_mut().rev() {
|
||||
if scratch.is_empty() {
|
||||
for _ in 0..scratch.capacity() {
|
||||
scratch.push(carry as u8);
|
||||
carry /= 256;
|
||||
}
|
||||
} else {
|
||||
for d256 in scratch.iter_mut() {
|
||||
carry += u32::from(*d256) * 58;
|
||||
*d256 = carry as u8; // cast loses data intentionally
|
||||
carry /= 256;
|
||||
}
|
||||
}
|
||||
assert_eq!(carry, 0);
|
||||
}
|
||||
|
||||
// Copy leading zeroes directly
|
||||
let mut ret: Vec<u8> = data.bytes().take_while(|&x| x == BASE58_CHARS[0]).map(|_| 0).collect();
|
||||
// Copy rest of string
|
||||
ret.extend(scratch.into_iter().skip_while(|&x| x == 0));
|
||||
ret.extend(scratch.into_iter().rev().skip_while(|&x| x == 0));
|
||||
Ok(ret)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue