1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use std; use std::io::{Read, Write}; use byteorder; use byteorder::{ReadBytesExt, WriteBytesExt}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Endian { Little, Big, } impl Default for Endian { fn default() -> Self { Endian::native() } } impl Endian { #[cfg(target_endian = "little")] pub fn native() -> Self { Endian::Little } #[cfg(target_endian = "big")] pub fn native() -> Self { Endian::Big } pub fn read_u16<R: Read>(&self, r: &mut R) -> Result<u16, std::io::Error> { match *self { Endian::Little => r.read_u16::<byteorder::LittleEndian>(), Endian::Big => r.read_u16::<byteorder::BigEndian>(), } } pub fn read_u32<R: Read>(&self, r: &mut R) -> Result<u32, std::io::Error> { match *self { Endian::Little => r.read_u32::<byteorder::LittleEndian>(), Endian::Big => r.read_u32::<byteorder::BigEndian>(), } } pub fn read_u64<R: Read>(&self, r: &mut R) -> Result<u64, std::io::Error> { match *self { Endian::Little => r.read_u64::<byteorder::LittleEndian>(), Endian::Big => r.read_u64::<byteorder::BigEndian>(), } } pub fn write_u16<W: Write>(&self, w: &mut W, val: u16) -> Result<(), std::io::Error> { match *self { Endian::Little => w.write_u16::<byteorder::LittleEndian>(val), Endian::Big => w.write_u16::<byteorder::BigEndian>(val), } } pub fn write_u32<W: Write>(&self, w: &mut W, val: u32) -> Result<(), std::io::Error> { match *self { Endian::Little => w.write_u32::<byteorder::LittleEndian>(val), Endian::Big => w.write_u32::<byteorder::BigEndian>(val), } } pub fn write_u64<W: Write>(&self, w: &mut W, val: u64) -> Result<(), std::io::Error> { match *self { Endian::Little => w.write_u64::<byteorder::LittleEndian>(val), Endian::Big => w.write_u64::<byteorder::BigEndian>(val), } } }