字节(Byte) 是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
计量单位
我们常见的十进制数字的计量单位有:个、十、百、千、万、亿,比亿还大的单位有:兆、京、垓、秭、穰、沟、涧、正、载、极。
二进制也有自己的计量单位。位(bit,Binary Digits):存放一位二进制数,即0或1,为最小的存储单位,8个二进制位为一个字节单位。更大的计量单位有KB、MB、GB、TB、PB、EB、ZB、YB、BB等。
二进制计量单位 | 单位换算 | 单位换算(科学计数法) | 十进制计量单位 | 单位换算 | 单位换算(科学计数法) |
b | bit(位) | 万 | 10的4次方 | ||
B | Byte(字节),1B=8b | 亿 | 万万 | 10的8次方 | |
KB | 1KB=1024B | 2的10次方 | 兆 | 万亿 | 10的12次方 |
MB | 1MB=1024KB | 2的20次方 | 京 | 万兆 | 10的16次方 |
GB | 1GB=1024MB | 2的30次方 | 垓 | 万京 | 10的20次方 |
TB | 1TB=1024GB | 2的40次方 | 秭 | 万垓 | 10的24次方 |
PB | 1PB=1024TB | 2的50次方 | 穰 | 万秭 | 10的28次方 |
EB | 1EB=1024PB | 2的60次方 | 沟 | 万穰 | 10的32次方 |
ZB | 1ZB=1024EB | 2的70次方 | 涧 | 万沟 | 10的36次方 |
YB | 1YB=1024ZB | 2的80次方 | 正 | 万涧 | 10的40次方 |
BB | 1BB=1024YB | 2的90次方 | 载 | 万正 | 10的44次方 |
NB | 1NB=1024BB | 2的100次方 | 极 | 万载 | 10的48次方 |
字节顺序:大端与小端
多字节字段中的值是按照大末尾(big-endian)顺序规定的,具体来说就是最高位的字节出现在高位,而低位的字节出现在低位。
数据是按照小末尾(little-endian)顺序存储的,高位的字节出现在低位。
常用的两种常用字节编码/解码方式:Base64编码、Hex编码;
Base64编码&解码
// &[u8;T]/String <=> Base64 String <=> Vec<u8> <=> String
let common_base64_str = base64::encode("中文@123&");
println!("common base64 string: {}", common_base64_str);
let common_vecu8 = base64::decode(&common_base64_str).unwrap();
println!("common string: {}", str::from_utf8(&common_vecu8).unwrap());
Hex编码&解码
// 编码和解码十六进制
let original = b"The quick brown fox jumps over the lazy dog.";
let expected = "54686520717569636B2062726F776E20666F78206A756D7073206F76\
657220746865206C617A7920646F672E";
let encoded = HEXUPPER.encode(original);
assert_eq!(encoded, expected);
let decoded = HEXUPPER.decode(&encoded.into_bytes())?;
assert_eq!(&decoded[..], &original[..]);
println!("{}", str::from_utf8(&decoded).unwrap());
let cn = HEXUPPER.encode("功成不必在我".as_bytes());
println!("{}", cn);
大数据
大数据时代,如何低成本、快速地存储、检索、处理海量数据成为很多企业不得不面临的巨大难题。零拷贝、分布式文件系统、分布式数据库、数据挖掘等技术逐渐得到发展。Rust凭借自身内存安全、高性能的优势正在发挥更大的作用:Rust正被引入Linux内核;微软同样在使用Rust重写Windows内核;国产分布式数据库TiDB使用Rust开发核心的存储引擎TiKV。“Rust重写一切”堪称降本增效的一把利器。
MMAP
#[test]
fn mmap_mut() -> Result<(), Error> {
use memmap::MmapMut;
use std::fs::OpenOptions;
use std::io::Write;
use std::ops::DerefMut;
use std::path::PathBuf;
// let file = File::options().write(true).open("abcd.txt")?;
let path: PathBuf = PathBuf::from("abcd.txt");
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(&path)?;
file.set_len(30)?;
let mut mmap = unsafe { MmapMut::map_mut(&file)? };
// mmap.copy_from_slice(b"Hello, world!");
(&mut mmap[..]).write_all(b"Hello BeiJing! Hello, world!")?;
mmap.flush()?;
Ok(())
}
mmap-sync Rust library for concurrent data access, using memory-mapped files, zero-copy deserialization, and wait-free synchronization.