byteorder_slice 3.0.0

Byteorder like crate for &[u8]
Documentation
use byteorder_slice::result::ReadSlice;
use byteorder_slice::{BigEndian, LittleEndian};
use hex_literal::hex;

#[test]
fn u8() {
    let mut data = hex!("01 80").as_ref();
    assert!(matches!(data.read_u8(), Ok(1)));
    assert!(matches!(data.read_u8(), Ok(128)));
    assert!(matches!(data.read_u8(), Err(_)));
}

#[test]
fn i8() {
    let mut data = hex!("01 80").as_ref();
    assert!(matches!(data.read_i8(), Ok(1)));
    assert!(matches!(data.read_i8(), Ok(-128)));
    assert!(matches!(data.read_i8(), Err(_)));
}

#[test]
fn u16_be() {
    let mut data = hex!("0102 8000").as_ref();
    assert!(matches!(data.read_u16::<BigEndian>(), Ok(258)));
    assert!(matches!(data.read_u16::<BigEndian>(), Ok(32768)));
    assert!(matches!(data.read_u16::<BigEndian>(), Err(_)));
}

#[test]
fn u16_le() {
    let mut data = hex!("0201 0080").as_ref();
    assert!(matches!(data.read_u16::<LittleEndian>(), Ok(258)));
    assert!(matches!(data.read_u16::<LittleEndian>(), Ok(32768)));
    assert!(matches!(data.read_u16::<LittleEndian>(), Err(_)));
}

#[test]
fn i16_be() {
    let mut data = hex!("0102 8000").as_ref();
    assert!(matches!(data.read_i16::<BigEndian>(), Ok(258)));
    assert!(matches!(data.read_i16::<BigEndian>(), Ok(-32768)));
    assert!(matches!(data.read_i16::<BigEndian>(), Err(_)));
}

#[test]
fn i16_le() {
    let mut data = hex!("0201 0080").as_ref();
    assert!(matches!(data.read_i16::<LittleEndian>(), Ok(258)));
    assert!(matches!(data.read_i16::<LittleEndian>(), Ok(-32768)));
    assert!(matches!(data.read_i16::<LittleEndian>(), Err(_)));
}

#[test]
fn u32_be() {
    let mut data = hex!("01020304 80000000").as_ref();
    assert!(matches!(data.read_u32::<BigEndian>(), Ok(16909060)));
    assert!(matches!(data.read_u32::<BigEndian>(), Ok(2147483648)));
    assert!(matches!(data.read_u32::<BigEndian>(), Err(_)));
}

#[test]
fn u32_le() {
    let mut data = hex!("04030201 00000080").as_ref();
    assert!(matches!(data.read_u32::<LittleEndian>(), Ok(16909060)));
    assert!(matches!(data.read_u32::<LittleEndian>(), Ok(2147483648)));
    assert!(matches!(data.read_u32::<LittleEndian>(), Err(_)));
}

#[test]
fn i32_be() {
    let mut data = hex!("01020304 80000000").as_ref();
    assert!(matches!(data.read_i32::<BigEndian>(), Ok(16909060)));
    assert!(matches!(data.read_i32::<BigEndian>(), Ok(-2147483648)));
    assert!(matches!(data.read_i32::<BigEndian>(), Err(_)));
}

#[test]
fn i32_le() {
    let mut data = hex!("04030201 00000080").as_ref();
    assert!(matches!(data.read_i32::<LittleEndian>(), Ok(16909060)));
    assert!(matches!(data.read_i32::<LittleEndian>(), Ok(-2147483648)));
    assert!(matches!(data.read_i32::<LittleEndian>(), Err(_)));
}

#[test]
fn u64_be() {
    let mut data = hex!("0102030405060708 8000000000000000").as_ref();
    assert!(matches!(data.read_u64::<BigEndian>(), Ok(72623859790382856)));
    assert!(matches!(data.read_u64::<BigEndian>(), Ok(9223372036854775808)));
    assert!(matches!(data.read_u64::<BigEndian>(), Err(_)));
}

#[test]
fn u64_le() {
    let mut data = hex!("0807060504030201 0000000000000080").as_ref();
    assert!(matches!(data.read_u64::<LittleEndian>(), Ok(72623859790382856)));
    assert!(matches!(data.read_u64::<LittleEndian>(), Ok(9223372036854775808)));
    assert!(matches!(data.read_u64::<LittleEndian>(), Err(_)));
}

#[test]
fn i64_be() {
    let mut data = hex!("0102030405060708 8000000000000000").as_ref();
    assert!(matches!(data.read_i64::<BigEndian>(), Ok(72623859790382856)));
    assert!(matches!(data.read_i64::<BigEndian>(), Ok(-9223372036854775808)));
    assert!(matches!(data.read_i64::<BigEndian>(), Err(_)));
}

#[test]
fn i64_le() {
    let mut data = hex!("0807060504030201 0000000000000080").as_ref();
    assert!(matches!(data.read_i64::<LittleEndian>(), Ok(72623859790382856)));
    assert!(matches!(data.read_i64::<LittleEndian>(), Ok(-9223372036854775808)));
    assert!(matches!(data.read_i64::<LittleEndian>(), Err(_)));
}

#[test]
fn u128_be() {
    let mut data = hex!("0102030405060708090A0B0C0D0E0F10 80000000000000000000000000000000").as_ref();
    assert!(matches!(data.read_u128::<BigEndian>(), Ok(1339673755198158349044581307228491536)));
    assert!(matches!(data.read_u128::<BigEndian>(), Ok(170141183460469231731687303715884105728)));
    assert!(matches!(data.read_u128::<BigEndian>(), Err(_)));
}

#[test]
fn u128_le() {
    let mut data = hex!("0102030405060708090A0B0C0D0E0F10 80000000000000000000000000000000").as_ref();
    assert!(matches!(data.read_u128::<BigEndian>(), Ok(1339673755198158349044581307228491536)));
    assert!(matches!(data.read_u128::<BigEndian>(), Ok(170141183460469231731687303715884105728)));
    assert!(matches!(data.read_u128::<BigEndian>(), Err(_)));
}

#[test]
fn i128_be() {
    let mut data = hex!("0102030405060708090A0B0C0D0E0F10 80000000000000000000000000000000").as_ref();
    assert!(matches!(data.read_i128::<BigEndian>(), Ok(1339673755198158349044581307228491536)));
    assert!(matches!(data.read_i128::<BigEndian>(), Ok(-170141183460469231731687303715884105728)));
    assert!(matches!(data.read_i128::<BigEndian>(), Err(_)));
}

#[test]
fn i128_le() {
    let mut data = hex!("100F0E0D0C0B0A090807060504030201 00000000000000000000000000000080").as_ref();
    assert!(matches!(data.read_i128::<LittleEndian>(), Ok(1339673755198158349044581307228491536)));
    assert!(matches!(data.read_i128::<LittleEndian>(), Ok(-170141183460469231731687303715884105728)));
    assert!(matches!(data.read_i128::<LittleEndian>(), Err(_)));
}

#[test]
fn uint_be() {
    let mut data = hex!("01 0102 010203 01020304 0102030405 010203040506 01020304050607 0102030405060708
                         010203040506070809 0102030405060708090A 0102030405060708090A0B 0102030405060708090A0B0C
                         0102030405060708090A0B0C0D 0102030405060708090A0B0C0D0E 0102030405060708090A0B0C0D0E0F 0102030405060708090A0B0C0D0E0F10
                         0102030405060708090A0B0C0D0E0F1011").as_ref();

    assert!(matches!(data.read_uint128::<BigEndian>(1), Ok(1)));
    assert!(matches!(data.read_uint128::<BigEndian>(2), Ok(258)));
    assert!(matches!(data.read_uint128::<BigEndian>(3), Ok(66051)));
    assert!(matches!(data.read_uint128::<BigEndian>(4), Ok(16909060)));
    assert!(matches!(data.read_uint128::<BigEndian>(5), Ok(4328719365)));
    assert!(matches!(data.read_uint128::<BigEndian>(6), Ok(1108152157446)));
    assert!(matches!(data.read_uint128::<BigEndian>(7), Ok(283686952306183)));
    assert!(matches!(data.read_uint128::<BigEndian>(8), Ok(72623859790382856)));
    assert!(matches!(data.read_uint128::<BigEndian>(9), Ok(18591708106338011145)));
    assert!(matches!(data.read_uint128::<BigEndian>(10), Ok(4759477275222530853130)));
    assert!(matches!(data.read_uint128::<BigEndian>(11), Ok(1218426182456967898401291)));
    assert!(matches!(data.read_uint128::<BigEndian>(12), Ok(311917102708983781990730508)));
    assert!(matches!(data.read_uint128::<BigEndian>(13), Ok(79850778293499848189627010061)));
    assert!(matches!(data.read_uint128::<BigEndian>(14), Ok(20441799243135961136544514575630)));
    assert!(matches!(data.read_uint128::<BigEndian>(15), Ok(5233100606242806050955395731361295)));
    assert!(matches!(data.read_uint128::<BigEndian>(16), Ok(1339673755198158349044581307228491536)));
}

#[test]
fn uint_le() {
    let mut data = hex!("01 0201 030201 04030201 0504030201 060504030201 07060504030201 0807060504030201
                         090807060504030201 0A090807060504030201 0B0A090807060504030201 0C0B0A090807060504030201
                         0D0C0B0A090807060504030201 0E0D0C0B0A090807060504030201 0F0E0D0C0B0A090807060504030201 100F0E0D0C0B0A090807060504030201
                         11100F0E0D0C0B0A090807060504030201").as_ref();

    assert!(matches!(data.read_uint128::<LittleEndian>(1), Ok(1)));
    assert!(matches!(data.read_uint128::<LittleEndian>(2), Ok(258)));
    assert!(matches!(data.read_uint128::<LittleEndian>(3), Ok(66051)));
    assert!(matches!(data.read_uint128::<LittleEndian>(4), Ok(16909060)));
    assert!(matches!(data.read_uint128::<LittleEndian>(5), Ok(4328719365)));
    assert!(matches!(data.read_uint128::<LittleEndian>(6), Ok(1108152157446)));
    assert!(matches!(data.read_uint128::<LittleEndian>(7), Ok(283686952306183)));
    assert!(matches!(data.read_uint128::<LittleEndian>(8), Ok(72623859790382856)));
    assert!(matches!(data.read_uint128::<LittleEndian>(9), Ok(18591708106338011145)));
    assert!(matches!(data.read_uint128::<LittleEndian>(10), Ok(4759477275222530853130)));
    assert!(matches!(data.read_uint128::<LittleEndian>(11), Ok(1218426182456967898401291)));
    assert!(matches!(data.read_uint128::<LittleEndian>(12), Ok(311917102708983781990730508)));
    assert!(matches!(data.read_uint128::<LittleEndian>(13), Ok(79850778293499848189627010061)));
    assert!(matches!(data.read_uint128::<LittleEndian>(14), Ok(20441799243135961136544514575630)));
    assert!(matches!(data.read_uint128::<LittleEndian>(15), Ok(5233100606242806050955395731361295)));
    assert!(matches!(data.read_uint128::<LittleEndian>(16), Ok(1339673755198158349044581307228491536)));
}

#[test]
fn int_be() {
    let mut data = hex!("81 8182 818283 81828384 8182838485 818283848586 81828384858687 8182838485868788
                         818283848586878889 8182838485868788898A 8182838485868788898A8B 8182838485868788898A8B8C
                         8182838485868788898A8B8C8D 8182838485868788898A8B8C8D8E 8182838485868788898A8B8C8D8E8F 8182838485868788898A8B8C8D8E8F18
                         8182838485868788898A8B8C8D8E8F1811").as_ref();

    assert!(matches!(data.read_int128::<BigEndian>(1), Ok(-127)));
    assert!(matches!(data.read_int128::<BigEndian>(2), Ok(-32382)));
    assert!(matches!(data.read_int128::<BigEndian>(3), Ok(-8289661)));
    assert!(matches!(data.read_int128::<BigEndian>(4), Ok(-2122153084)));
    assert!(matches!(data.read_int128::<BigEndian>(5), Ok(-543271189371)));
    assert!(matches!(data.read_int128::<BigEndian>(6), Ok(-139077424478842)));
    assert!(matches!(data.read_int128::<BigEndian>(7), Ok(-35603820666583417)));
    assert!(matches!(data.read_int128::<BigEndian>(8), Ok(-9114578090645354616)));
    assert!(matches!(data.read_int128::<BigEndian>(9), Ok(-2333331991205210781559)));
    assert!(matches!(data.read_int128::<BigEndian>(10), Ok(-597332989748533960078966)));
    assert!(matches!(data.read_int128::<BigEndian>(11), Ok(-152917245375624693780215157)));
    assert!(matches!(data.read_int128::<BigEndian>(12), Ok(-39146814816159921607735080052)));
    assert!(matches!(data.read_int128::<BigEndian>(13), Ok(-10021584592936939931580180493171)));
    assert!(matches!(data.read_int128::<BigEndian>(14), Ok(-2565525655791856622484526206251634)));
    assert!(matches!(data.read_int128::<BigEndian>(15), Ok(-656774567882715295356038708800418161)));
    assert!(matches!(data.read_int128::<BigEndian>(16), Ok(-168134289377975115611145909452907049192)));

    assert!(matches!(hex!("FF7F").as_ref().read_int128::<BigEndian>(2), Ok(-129)));
}

#[test]
fn int_le() {
    let mut data = hex!("81 8281 838281 84838281 8584838281 868584838281 87868584838281 8887868584838281
                         898887868584838281 8A898887868584838281 8B8A898887868584838281 8C8B8A898887868584838281
                         8D8C8B8A898887868584838281 8E8D8C8B8A898887868584838281 8F8E8D8C8B8A898887868584838281 188F8E8D8C8B8A898887868584838281
                         11188F8E8D8C8B8A898887868584838281").as_ref();

    assert!(matches!(data.read_int128::<LittleEndian>(1), Ok(-127)));
    assert!(matches!(data.read_int128::<LittleEndian>(2), Ok(-32382)));
    assert!(matches!(data.read_int128::<LittleEndian>(3), Ok(-8289661)));
    assert!(matches!(data.read_int128::<LittleEndian>(4), Ok(-2122153084)));
    assert!(matches!(data.read_int128::<LittleEndian>(5), Ok(-543271189371)));
    assert!(matches!(data.read_int128::<LittleEndian>(6), Ok(-139077424478842)));
    assert!(matches!(data.read_int128::<LittleEndian>(7), Ok(-35603820666583417)));
    assert!(matches!(data.read_int128::<LittleEndian>(8), Ok(-9114578090645354616)));
    assert!(matches!(data.read_int128::<LittleEndian>(9), Ok(-2333331991205210781559)));
    assert!(matches!(data.read_int128::<LittleEndian>(10), Ok(-597332989748533960078966)));
    assert!(matches!(data.read_int128::<LittleEndian>(11), Ok(-152917245375624693780215157)));
    assert!(matches!(data.read_int128::<LittleEndian>(12), Ok(-39146814816159921607735080052)));
    assert!(matches!(data.read_int128::<LittleEndian>(13), Ok(-10021584592936939931580180493171)));
    assert!(matches!(data.read_int128::<LittleEndian>(14), Ok(-2565525655791856622484526206251634)));
    assert!(matches!(data.read_int128::<LittleEndian>(15), Ok(-656774567882715295356038708800418161)));
    assert!(matches!(data.read_int128::<LittleEndian>(16), Ok(-168134289377975115611145909452907049192)));
}