第十 万物皆可编码

基本类型

正如之前章节的介绍,通过编码技术,我们可以实现对数字、文字、符号、时间等数据进行编码以便在计算机中进行各种处理。

因此才有了整型、浮点型、字符串、数组、切片、哈希表、元组等基本类型,这些构成了编程语言的类型系统。

Rust基本类型。数字类型:i8、i16、i32、i64、i124、u8、u16、u32、u64、u128等

数据类型,即数个字节编码的十进制数字。而最为普遍的字符串string,则是一个可变长度的、符合UTF8编码规范的字节数组。

面向对象

物以类聚,人以群分。”,面向对象通过抽象方法,提取同类事物的关键信息,形成类。

对象

按照GB/T 17969. 1(ISO/IEC 9834-1)的定义,对象是指“通信和信息处理世界中的任何事物,它是可标识(可以命名)的,同时它可被注册”。对象标识符(Object Identifier,OID)是与对象相关联的用来无歧义地标识对象的全局唯一的值,可保证对象在通信与信息处理中正确地定位和管理。通俗地讲,OID就是网络通信中对象的身份证。

ID

同一类型,拥有拥有数以亿计的对象,如何区分这些独一无二的个体呢?其实要做到这一点并不难,只要给这些个体一个全局唯一的“身份”即可。身份证号、手机号、IP地址、统一社会信用代码。

lazy_static! {

    static ref IDENTIFIER_REGEX: Regex = Regex::new("^([0-9ABCDEFGY]{1})([1239]{1})([0-9ABCDEFGHJKLMNPQRTUWXY]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9ABCDEFGHJKLMNPQRTUWXY])$").unwrap();

    static ref REGEX_18_ID_CARD_NO: Regex = Regex::new(r"^\d{17}[\dX]$").unwrap();

    static ref ID_CARD_POWER: Vec<usize> = vec![7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];

    static ref WEIGHT: Vec<usize> = vec![1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];

    static ref VERIFY_CODE_MAP: HashMap<char,usize> = {

        let verify_code = "0123456789ABCDEFGHJKLMNPQRTUWXY";

        let verify_code_vec :Vec<char> = verify_code.chars().collect();

        let mut verify_code_map = HashMap::new();

        for (i,item) in verify_code_vec.iter().enumerate().take(verify_code.len()){

            verify_code_map.insert(*item,i);


        }

        println!("{:?}",verify_code_map);

        verify_code_map

    };

    // 公司名称需要排除的字符串,不包含中英文括号

    static ref REGEX_NOT_COMPANY_NAME: Regex = Regex::new(r###"[`~!@#$%^&*+=|{}':;',\\.<>《》/?~!@#¥%……&*——+|\-{}\[\]【】‘;:"”“’。,、?]"###).unwrap();

    // 金钱(千分位)

    static ref MONEY_REGEX: Regex = Regex::new(r"^(-)?\d{1,3}(,\d{3})*(.\d+)?$").unwrap();

}


/// 18位身份证号校验

pub fn is_18_id_card(id_card_no: &str) -> bool {

    if !REGEX_18_ID_CARD_NO.is_match(id_card_no) {

        println!("{} isn't match regex", id_card_no);

        return false;

    }


    let id_card_no_chars: Vec<char> = id_card_no.chars().collect();

    let mut sum = 0;

    for i in 0..17 {

        let ch = id_card_no_chars[i] as usize - 48;

        sum += ch * ID_CARD_POWER[i];

    }


    let check_code = match sum % 11 {

        10 => '2',

        9 => '3',

        8 => '4',

        7 => '5',

        6 => '6',

        5 => '7',

        4 => '8',

        3 => '9',

        2 => 'X',

        1 => '0',

        0 => '1',

        _ => 'N',

    };


    check_code == id_card_no_chars[17]

}

更多代码

在一些场景(特别是数据库主键、网络请求序列号)为了快速获得全局唯一的ID,人们发明了

UUIDnanoid、雪花算法。

一切皆文件

    // 将文件读取为字节数组

    if let Ok(cipher_data) = std::fs::read("why-rust.crypto") {

        let plaintext = cipher

            .decrypt(nonce, cipher_data.as_ref())

            .expect("decryption failure!");

        println!("{}", String::from_utf8(plaintext).unwrap());

    }


    /// 逐行读取文件

    #[test]

    fn read_file_lines() {

        match File::open("why-rust.txt") {

            Ok(f) => {

                let reader = BufReader::new(f);

                let lines = reader.lines();

                for line in lines.map(|x| x.unwrap()) {

                    println!("{}", line);

                }

            }

            Err(e) => panic!("can't open this file :{}", e),

        }

    }


    ///将文件读取为一个字符串

    match std::fs::read_to_string("provinces.json") {

        Ok(data) => {

            println!("open provinces.json...");

            let v: Vec<AdministrativeDivisions> = serde_json::from_str(&data).unwrap();


            for ad in v {

                println!("{:?}={:?}", ad.code, ad.name);

            }

        }

        Err(e) => panic!("can't open this file : {}", e),

    }


    // 将字节数组写入文件

    let mut all_bytes = Vec::<u8>::with_capacity(128);

    all_bytes.extend_from_slice(&key);

    all_bytes.extend_from_slice(&iv);

    all_bytes.extend_from_slice(&encrypt_bytes);


    std::fs::write("poem.crypto", &all_bytes);

文件格式

为了方便计算机识别、处理、存储各类不同的数据文件,采用不同的编码方式(即文件格式)编码特定的数据。不论是简单的txt,xml,json等格式的数据还是复杂的doc,xls,pdf、[OFD]等格式。

办公三件套:Word,Excel,PPT

微软的Office办公三件套:Word,Excel,PowerPoint成为办公领域的标准,每年为微软创造上百亿美元的收入。

国内金山办公经过三十多年的追赶,其产品WPS终于在办公软件拥有一席之地、站稳了脚跟。

Excel

calamine Rust实现的Excel工具,目前只支持读操作(不支持写操作)。

use calamine::DataType::{

    Bool, DateTime, DateTimeIso, Duration, DurationIso, Empty, Error, Float, String,

};

use calamine::{

    open_workbook, open_workbook_auto, Ods, Reader, Sheet, SheetType, SheetVisible, Xls, Xlsb, Xlsx,

};

use calamine::{CellErrorType::*, DataType};


#[test]

fn any_sheets_xlsx() {

    let path = format!(

        "{}/examples/file/any_sheets.xlsx",

        env!("CARGO_MANIFEST_DIR")

    );

    println!("{}", &path);

    let mut workbook: Xlsx<_> = open_workbook(path).unwrap();


    let range = workbook.worksheet_range("Visible").unwrap();

    let total_cells = range.get_size().0 * range.get_size().1;

    let non_empty_cells: usize = range.used_cells().count();

    println!(

        "Found {} cells in 'Sheet1', including {} non empty cells",

        total_cells, non_empty_cells

    );

    // alternatively, we can manually filter rows

    assert_eq!(

        non_empty_cells,

        range

            .rows()

            .flat_map(|r| r.iter().filter(|&c| c != &DataType::Empty))

            .count()

    );

}

对象标识符 ObjectIdentifier OID

PDF(Portable Document Format)  可携带文件格式

OFD 版式文档国家标准




 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值