summaryrefslogtreecommitdiff
path: root/src/encoding.rs
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2020-01-12 21:08:12 +0100
committertomsmeding <tom.smeding@gmail.com>2020-01-12 21:08:12 +0100
commit771ff47545cea2b3e9a12aceb305ffcb53aa40b6 (patch)
tree008ba3a5512451be9293ac64a0250a87b99b0c53 /src/encoding.rs
parent5e39d6876b806604090b892369cba9892c7dac25 (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.rs37
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])
+}