diff options
author | tomsmeding <tom.smeding@gmail.com> | 2020-01-12 21:08:12 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2020-01-12 21:08:12 +0100 |
commit | 771ff47545cea2b3e9a12aceb305ffcb53aa40b6 (patch) | |
tree | 008ba3a5512451be9293ac64a0250a87b99b0c53 /src/encoding.rs | |
parent | 5e39d6876b806604090b892369cba9892c7dac25 (diff) |
Correctly write tags
It's now able to fix fake-utf8 v2.3 tags generated with the id3v2 tool!
Diffstat (limited to 'src/encoding.rs')
-rw-r--r-- | src/encoding.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/encoding.rs b/src/encoding.rs index fc0c335..9bc7290 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -1,7 +1,6 @@ use std::convert::TryFrom; -use std::io; +use std::io::{self, Write}; use crate::error::IntoIOError; -use crate::util::read_big_endian; macro_rules! guard { ($cond:expr) => { @@ -54,3 +53,37 @@ pub fn from_utf8_mistaken_as_latin1(latin1: &str) -> io::Result<String> { .map(|s| s.to_string()) .map_err(|e| e.ioerr())) } + +pub fn read_big_endian(bytes: &[u8], bits: usize) -> usize { + if bits > 8 { + panic!("Invalid number of bits in encoding::read_big_endian()"); + } + + bytes + .iter() + .enumerate() + .map(|(i, &b)| (b as usize) << (bits * (bytes.len() - 1 - i))) + .sum() +} + +pub fn write_big_endian<W: Write>(mut stream: W, mut value: usize, num_bytes: usize, bits: usize) -> io::Result<()> { + if num_bytes > 8 { + panic!("Invalid number of bytes in encoding::write_big_endian()"); + } + if bits > 8 || bits == 0 { + panic!("Invalid number of bits in encoding::write_big_endian()"); + } + + let mask = (1 << bits) - 1; + let mut bytes = [0u8; 8]; + for i in (0..num_bytes).rev() { + bytes[i] = (value & mask) as u8; + value >>= bits; + } + + if value != 0 { + panic!("Value doesn't fit in encoding::write_big_endian()"); + } + + stream.write_all(&bytes[0..num_bytes]) +} |