Types 将数字原语(i32、f64等)转换为字节表示形式

Types 将数字原语(i32、f64等)转换为字节表示形式,types,rust,Types,Rust,我正在写一个库,它将数据编码/解码成二进制格式。格式的一部分是数字,我使用Rust的原生基元类型(如i8,i64,f32等) 是否有一种简单的内置方法将这些数据类型转换为二进制或从二进制转换为二进制,即将f64/f32/i64/等转换为Vec?同样,有没有办法将4u8s(在Vecsay中)转换为f32?不幸的是,目前还没有安全的内置支持从Rust中的字节数组读写原语。但是,有几个社区图书馆是最常用的: extern crate byteorder; use byteorder::{Little

我正在写一个库,它将数据编码/解码成二进制格式。格式的一部分是数字,我使用Rust的原生基元类型(如
i8
i64
f32
等)


是否有一种简单的内置方法将这些数据类型转换为二进制或从二进制转换为二进制,即将
f64
/
f32
/
i64
/等转换为
Vec
?同样,有没有办法将4
u8
s(在
Vec
say中)转换为
f32

不幸的是,目前还没有安全的内置支持从Rust中的字节数组读写原语。但是,有几个社区图书馆是最常用的:

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);
    }
}

可以使用std::mem::transmute,尽管它不安全:

fn main() {
    let var1 = 12345678_i64;
    let raw_bytes: [i8; 8] = unsafe { std::mem::transmute(var1) };
    for byte in &raw_bytes {
        println!("{}", byte);
    }
}

注意:请确保这两个变量的大小完全相等。

如果您的目标是打印字节或将它们置于
str
表示法中,只需使用大括号格式的
:b
表示法即可

fn main() {
    println!("This is the binary of int {:b}", 4 as i32);
}
这张照片


这是int 100的二进制文件

从Rust 1.32开始,您可以使用
{to,from}{ne,le,be}{u字节
作为整数类型

let begin = 1234_i32;
let bytes = begin.to_ne_bytes();
let and_back = i32::from_ne_bytes(bytes);
对于浮点,您仍然必须依赖以前的方法。

Rust 1.40有:

将数字转换为字节并返回(适用于1.40之后的浮点和整数):

设x=65535_i32;
设x_bytes=x.to_be_bytes();//x_字节=[0,0,255,255]
让原始_x=i32::from_be_字节(x_字节);//原件x=65535=x
除锈前转换浮子1.40 Rust 1.32有:(仅适用于整数)和

将浮点值转换为字节并返回:

设y=255.255_f32;
设y_bytes=y.to_bits().to_be_bytes();
让原始_y=f32::from_位(u32::from_be_字节(y_字节));//原始值y=255.255=y

根据防锈文件,使用
std::slice::from\u raw\u parts
的代码较少,且标记稳定。但出于同样的原因,仍然不安全<代码>字节顺序精确地解决了这个问题。当我说“内置”时,我应该指定crates.io中的内容就足够了。确保正确的大小可以通过使用
std::mem::size\u of:()
而不是数组中的
8
来实现。以下几点:原始字节应该是
[u8;8]
(或者
mem::size\u of
,如果大小不匹配,
transmute
不起作用:“不能在不同大小的类型之间转换,或独立大小的类型之间转换”,因此它“有点安全”。请您将Nicholas Rishel的回答标记为已接受好吗?这就是现在的标准答案,而最古老的带有
transmute
示例的答案可能会产生误导。
let begin = 1234_i32;
let bytes = begin.to_ne_bytes();
let and_back = i32::from_ne_bytes(bytes);