范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Rust字节序操作byteorder

  字节序操作——byteorder
  字节数组操作是一个高频的操作,rust生态中有bytes和byteorder两个第三方库来处理。两个库的操作方法基本类似,我们选择byteorder 来做介绍。
  在byteorder中定义了BigEndian和LittleEndian两个枚举类,这两个枚举类分别实现了byteorder::ByteOrder个trait。
  byteorder::ByteOrder提供发了丰富的接口来实现常用类型转成字节数组。pub trait ByteOrder: Clone + Copy + Debug + Default + Eq + Hash + Ord + PartialEq + PartialOrd + Sealed {     fn read_u16(buf: &[u8]) -> u16;     fn read_u32(buf: &[u8]) -> u32;     fn read_u64(buf: &[u8]) -> u64;     fn read_u128(buf: &[u8]) -> u128;     fn read_uint(buf: &[u8], nbytes: usize) -> u64;     fn read_uint128(buf: &[u8], nbytes: usize) -> u128;     fn write_u16(buf: &mut [u8], n: u16);     fn write_u32(buf: &mut [u8], n: u32);     fn write_u64(buf: &mut [u8], n: u64);     fn write_u128(buf: &mut [u8], n: u128);     fn write_uint(buf: &mut [u8], n: u64, nbytes: usize);     fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize);     fn read_u16_into(src: &[u8], dst: &mut [u16]);     fn read_u32_into(src: &[u8], dst: &mut [u32]);     fn read_u64_into(src: &[u8], dst: &mut [u64]);     fn read_u128_into(src: &[u8], dst: &mut [u128]);     fn write_u16_into(src: &[u16], dst: &mut [u8]);     fn write_u32_into(src: &[u32], dst: &mut [u8]);     fn write_u64_into(src: &[u64], dst: &mut [u8]);     fn write_u128_into(src: &[u128], dst: &mut [u8]);     fn from_slice_u16(numbers: &mut [u16]);     fn from_slice_u32(numbers: &mut [u32]);     fn from_slice_u64(numbers: &mut [u64]);     fn from_slice_u128(numbers: &mut [u128]);     fn from_slice_f32(numbers: &mut [f32]);     fn from_slice_f64(numbers: &mut [f64]);      fn read_u24(buf: &[u8]) -> u32 { ... }     fn read_u48(buf: &[u8]) -> u64 { ... }     fn write_u24(buf: &mut [u8], n: u32) { ... }     fn write_u48(buf: &mut [u8], n: u64) { ... }     fn read_i16(buf: &[u8]) -> i16 { ... }     fn read_i24(buf: &[u8]) -> i32 { ... }     fn read_i32(buf: &[u8]) -> i32 { ... }     fn read_i48(buf: &[u8]) -> i64 { ... }     fn read_i64(buf: &[u8]) -> i64 { ... }     fn read_i128(buf: &[u8]) -> i128 { ... }     fn read_int(buf: &[u8], nbytes: usize) -> i64 { ... }     fn read_int128(buf: &[u8], nbytes: usize) -> i128 { ... }     fn read_f32(buf: &[u8]) -> f32 { ... }     fn read_f64(buf: &[u8]) -> f64 { ... }     fn write_i16(buf: &mut [u8], n: i16) { ... }     fn write_i24(buf: &mut [u8], n: i32) { ... }     fn write_i32(buf: &mut [u8], n: i32) { ... }     fn write_i48(buf: &mut [u8], n: i64) { ... }     fn write_i64(buf: &mut [u8], n: i64) { ... }     fn write_i128(buf: &mut [u8], n: i128) { ... }     fn write_int(buf: &mut [u8], n: i64, nbytes: usize) { ... }     fn write_int128(buf: &mut [u8], n: i128, nbytes: usize) { ... }     fn write_f32(buf: &mut [u8], n: f32) { ... }     fn write_f64(buf: &mut [u8], n: f64) { ... }     fn read_i16_into(src: &[u8], dst: &mut [i16]) { ... }     fn read_i32_into(src: &[u8], dst: &mut [i32]) { ... }     fn read_i64_into(src: &[u8], dst: &mut [i64]) { ... }     fn read_i128_into(src: &[u8], dst: &mut [i128]) { ... }     fn read_f32_into(src: &[u8], dst: &mut [f32]) { ... }     fn read_f32_into_unchecked(src: &[u8], dst: &mut [f32]) { ... }     fn read_f64_into(src: &[u8], dst: &mut [f64]) { ... }     fn read_f64_into_unchecked(src: &[u8], dst: &mut [f64]) { ... }     fn write_i8_into(src: &[i8], dst: &mut [u8]) { ... }     fn write_i16_into(src: &[i16], dst: &mut [u8]) { ... }     fn write_i32_into(src: &[i32], dst: &mut [u8]) { ... }     fn write_i64_into(src: &[i64], dst: &mut [u8]) { ... }     fn write_i128_into(src: &[i128], dst: &mut [u8]) { ... }     fn write_f32_into(src: &[f32], dst: &mut [u8]) { ... }     fn write_f64_into(src: &[f64], dst: &mut [u8]) { ... }     fn from_slice_i16(src: &mut [i16]) { ... }     fn from_slice_i32(src: &mut [i32]) { ... }     fn from_slice_i64(src: &mut [i64]) { ... }     fn from_slice_i128(src: &mut [i128]) { ... } } use byteorder::{ByteOrder, LittleEndian}; let mut buf = [0; 4]; LittleEndian::write_u32(&mut buf, 1_000_000); assert_eq!(1_000_000, LittleEndian::read_u32(&buf)); use byteorder::{ByteOrder, BigEndian}; let mut buf = [0; 2]; BigEndian::write_i16(&mut buf, -5_000); assert_eq!(-5_000, BigEndian::read_i16(&buf)); use byteorder::{ByteOrder, BigEndian}; let mut numbers = [5, 65000]; BigEndian::from_slice_i64(&mut numbers); assert_eq!(numbers, [5i64.to_be(), 65000i64.to_be()]);
  选择byteorder的另一个重要原因是,byteorder定义了另外两个ReadBytesExt和WriteBytesExttrait,
  ReadBytesExt继承了std::io::Readtrait,然后所有实现std::io::Read的类,将免费获取ReadBytesExt。 WriteBytesExt继承了std::io::Writetrait,然后所有实现std::io::Write的类,将免费获取WriteBytesExt。use std::io::Cursor; use byteorder::{BigEndian, ReadBytesExt};  let mut rdr = Cursor::new(vec![2, 5, 3, 0]); //Cursor<[u8]>实现了std::io::Read 所有免费实现了ReadBytesExt assert_eq!(517, rdr.read_u16::().unwrap()); assert_eq!(768, rdr.read_u16::().unwrap()); use std::f32; use std::io::Cursor;  use byteorder::{BigEndian, ReadBytesExt};  let mut rdr = Cursor::new(vec![     0x40, 0x49, 0x0f, 0xdb,     0x3f, 0x80, 0x00, 0x00, ]); let mut dst = [0.0; 2]; rdr.read_f32_into::(&mut dst).unwrap(); //读取 float32 数组 assert_eq!([f32::consts::PI, 1.0], dst); use byteorder::WriteBytesExt;  let mut wtr = Vec::new(); //Vec<[u8]>实现了std::io::Write 免费实现了WriteBytesExt wtr.write_u8(2).unwrap(); wtr.write_u8(5).unwrap(); assert_eq!(wtr, b" "); 自己实现序列化和反序列化struct#[derive(Debug)] pub struct Person {     features:HashMap>,     feature_size :u16,     channel_bit:u64, }   impl Person {     fn size(&self)->usize {         let length = self.features.len();         if length < 1 {             return 7         }         1 + 2 + 8 + (1+self.feature_size as usize *4)*length     }      pub fn marshal(&self) ->Option> {         if self.size() < 11 {             return None         }         let mut buf = Vec::with_capacity(self.size());         buf.write_u8(self.features.len() as u8);         buf.write_u16::(self.feature_size);         buf.write_u64::(self.channel_bit);         for (k,v) in & self.features {             buf.write_u8(*k as u8);             unsafe {                 let b = std::slice::from_raw_parts(v.as_ptr() as *const u8, v.len() * 4);                 buf.write_all(b); //write_all 方法来着 std::io::Write trait             }         }         Some(buf)     }       pub fn unmarshal(&mut self,b :&[u8])->std::result::Result<(),std::io::Error> {         if b.len() < 11 {             return Err(std::io::Error::new(std::io::ErrorKind::Other,"to short"))         }         let mut rdr = Cursor::new(b);         let length = rdr.read_u8()?;         self.feature_size = rdr.read_u16::()?;         self.channel_bit =  rdr.read_u64::()?;         for _ in 0..length{             let key = rdr.read_u8()?;             let mut feature = vec![0.0;self.feature_size as usize];             rdr.read_f32_into::(&mut feature)?;             self.features.insert(key as i8,feature);         }         Ok(())     } }  fn main() {     let mut features = HashMap::new();     features.insert(1i8, Vec::from([2.9;2048]));     features.insert(2i8, Vec::from([2.9;2048]));      let person = Person {         features,         feature_size:2048,         channel_bit:0     };      let bytes = person.marshal().unwrap();     let mut personb = Person {         features:HashMap::new(),         feature_size:2048,         channel_bit:0     };      personb.unmarshal(& bytes).unwrap();     println!("{:?}",person);     println!("{:?}",personb);     assert_eq!(person.features.get(&1).unwrap(), personb.features.get(&1).unwrap()) }

老公在深圳月薪8000被辱骂废物老公在深圳月薪8000元被老婆辱骂废物,结果一怒之下,一耳光结束了婚姻。这叫8000元以下的的情何以堪。公司何军请我吃宵夜,大倒苦水,但又显一身轻松,原来他与他老婆彻底离了,一次性上世纪土豪靠运气的钱定靠实力亏掉靠运气富起来的土豪,随岁月淘沙靠实力又返贫了。最开始改革开放靠关系与送礼富起来的包工头与建筑老板,开赌场,开所谓按摩院的,依靠色情业发迹的人,绝大多数又返贫了。记得2019年去医院剖析拉闸限电背后的最简单逻辑中国拉闸限电最简单的逻辑,不要再听砖家那一套极其复杂的高大上理论了。简单理由一工业用电每度平均算0。85元每度,煤电成本,平时煤价稳定时,大概一度电原料成本就0。3元,还得加上人工任正非做的不是为赚钱的企业而是一项民族复兴的伟业任正非引领的华为不是做企业,而是做一项前无古人后无来吉伟大事业。任正非43岁时才从人生最低谷起步,期间艰辛凡人无法想象。当他再一次事业风生水起时,一般人都会选择享受人生了。可他带领房地产的钱去哪了,为什么房地公司巨额外债爆雷房地产的丰功伟绩,这段时间好多房地产公司资金爆雷,房地产的钱去哪了?我的印象中,刚开始做房地产时,只要付了中间费叫代办注册一房地产公司。就可以经营房地产了。最开始包括国有土地都不是以黑达绿,长安要用科技改变未来汽车生活在2021长安汽车科技生态大会上,长安汽车发布了企业新汽车新生态战略,对未来的长安汽车发展方向提出切实的目标。但这个目标如何达成,长安汽车用科技给出了答案。当日下午举办的绿色智能,小鹏汽车科技日,已成小鹏汽车幻想日?科幻作家刘慈欣在获得雨果奖之后说过我只写可能发生的科幻。文学如此,科学更是如此。科技仅仅对认识和改造物质世界有效,真正的未来科技,是建立在对自己和环境的准确认识基础上的对未来的一系农村又迎好消息!科技开始下乡,农产品从ampampquot种ampampquot到ampampquot卖ampampquot彻底变样最近,农业农村部与华为在东莞签署战略合作,双方将重点围绕5G大数据物联网云计算人工智能等现代信息技术,推动现代信息技术与农业农村生产生活生态加速融合。这意味着,将有更多高科技被运用李国庆俞渝当当网之间那些事今天,李国庆,当当网,抢夺公章成为网络热门词语,原因就是今天李国庆伙同5人,闯入当当网办公区,抢走几十枚公章财务章。为什么作为当当网创始人的李国庆会做出如此举动?把自己俞渝和当当网这项技术将跟5G技术并驾齐驱!中国黑科技让人眼花缭乱这段时间,网上吵得比较凶的一个话题就是5G网络。5G网络的引领者就是中国,而中国也将成为5G时代的规则制定者。不过这只是众多好消息中的一个好消息罢了,随着中国科技发展的越来越强大,图鸭科技包揽CVPR2019图像压缩大赛四项指标全部冠军近些年来,随着手机市场竞争的日渐激烈,消费者们应该也都有注意到各家手机厂商也纷纷在摄像头的像素上不断提升性能。曾经500万摄像头是时尚高端手机的标配,而在今天,部分高端旗舰机型像素
Apple最新季度财报收益高达814亿美元大中华区销售额猛增超50Apple公司于2021年第三季度财报显示营收入创历年同期最高纪录增长36达到814亿美元,可谓是迎来非常出色的季度,主要得益于iPhone销售额从260亿美元增加至395亿美元,J。R。史密斯正式重返校园并期盼能加入高尔夫球校队出赛NCAA35岁的NBA球员J。R。Smith正式重返校园,于高中跳级加入NBA的他目前正就读北卡罗来纳州立农业技术大学(NorthCarolinaATStateUniversity),并期讴歌NSX最终代TypeS于北美地区上市24小时极速售罄本田旗下豪华汽车品牌Acura讴歌在上月中正式推出了超跑NSX的最终回车型TypeS,此车被誉为有史以来最速最强悍操控性最佳的量产版本NSX,其搭载的3。5升双涡轮增压引擎和三只电第36届法国耶尔艺术节未来时尚设计之星诞生SofiaIlmonen为庆祝梅赛德斯奔驰与耶尔艺术节的长期合作友好关系,梅赛德斯奔驰设立了可持续发展奖,这是耶尔艺术节第一个以可持续发展为主题的奖项并延续了品牌推动奢侈品发展这一远大的目标。该奖项与品牌福布斯公布2021年全美富豪榜,最年轻29岁福布斯早先正式公布2021年的全美收入最高富豪榜,此排名一共囊括了400人,整体较上年增加了40,从3。2兆美元达到4。5兆美元。而今次的榜首是由7月刚完成太空之旅的JeffBez2021年第四届宝珀理想国文学奖初名单公布2021年第四届宝珀理想国文学奖初选名单今日公布,11位青年作家的作品入围。本年度报名作品数量再创新高,由阿来格非李宗盛梁鸿马家辉(按照名字拼音排序)组成的当届评委会经数月悉心审阅蚁起悦暖冬元气新出行奇瑞新能源约惠不停随着早冬的来临,金九银十销售旺季逐步接近尾声,这也让车企鏖战的喧闹告一段落。在这场销量争夺赛中,奇瑞新能源不负众望地迎来金秋硕果,凭借时尚精致的颜值和出色的产品力表现,奇瑞小蚂蚁1来自武汉五个大好消息!无不彰显武汉具有成为国际大都市的潜力我向往的武汉要说继北上广之后,国内最具有国际性大都市的潜力的城市非武汉莫属了。近段时间,武汉传来了五个特大好消息,会再度激发武汉建设国际性大都市的潜能!了解了这些武汉未来发展的潜力冬奥倒计时100天,小柯的这首歌可能是最接近北京欢迎你的了今天是北京冬奥会倒计时99天了,所有人都很期待在倒计时100天之际,能在电视上看到一个媲美于当年北京奥运会倒计时100天播出的北京欢迎你一样的名场面。但时过境迁,在文娱高速发展的今有人物联网诚邀您前来参加中国国际工业博览会(内附免费门票)9月15日19日,2020第22届中国国际工业博览会将在国家会展中心(上海)举办,有人物联网在6。1HA105展位,诚邀您前来参加。工博会简介本届工博会以智能互联赋能产业新发展为主南非如何在殖民者手中不断转手?说起南非,很多人可能会想到南非的钻石,因为南非出产的钻石一直是高品质钻石的代名词。南非这个国家其实也正如钻石一样闪耀,但是仔细一看南非的经历,却让人不由得感叹,这颗钻石上带着血色。