From 771ff47545cea2b3e9a12aceb305ffcb53aa40b6 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sun, 12 Jan 2020 21:08:12 +0100 Subject: Correctly write tags It's now able to fix fake-utf8 v2.3 tags generated with the id3v2 tool! --- src/encoding.rs | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'src/encoding.rs') 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 { .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(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]) +} -- cgit v1.2.3-54-g00ecf