我正在写一个库,它可以对二进制格式的数据进行编码/解码.格式的一部分是数字,我使用Rust的原生原始类型(比如i8
、i64
、f32
等).
是否有一种简单的内置方法将这些数据类型转换为二进制或从二进制转换为二进制,即将f64
/f32
/i64
/等转换为Vec<u8>
?同样,有没有办法将4 u8
(比如说Vec<u8>
)转换成f32
?
我正在写一个库,它可以对二进制格式的数据进行编码/解码.格式的一部分是数字,我使用Rust的原生原始类型(比如i8
、i64
、f32
等).
是否有一种简单的内置方法将这些数据类型转换为二进制或从二进制转换为二进制,即将f64
/f32
/i64
/等转换为Vec<u8>
?同样,有没有办法将4 u8
(比如说Vec<u8>
)转换成f32
?
不幸的是,目前还没有安全的内置支持从Rust中的字节数组读写原语.然而,有几个社区图书馆可供使用,其中byteorder个是使用最多的:
extern crate byteorder;
use byteorder::{LittleEndian, WriteBytesExt};
use std::mem;
fn main() {
let i: i64 = 12345;
let mut bs = [0u8; mem::size_of::<i64>()];
bs.as_mut()
.write_i64::<LittleEndian>(i)
.expect("Unable to write");
for i in &bs {
println!("{:X}", i);
}
}
当然,你总是可以抛出原始指针.例如,可以将*const i64
转换为*const i8
,然后将其转换为适当的字节片&[u8]
.然而,这很容易出错,而且由于端性而依赖于平台,因此只能作为最后手段使用:
use std::{mem, slice};
fn main() {
let i: i64 = 12345;
let ip: *const i64 = &i;
let bp: *const u8 = ip as *const _;
let bs: &[u8] = unsafe { slice::from_raw_parts(bp, mem::size_of::<i64>()) };
for i in bs {
println!("{:X}", i);
}
}