015 Rust死灵书之Transmutes转换

本系列录制的视频主要放在B站上Rust死灵书学习视频

Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source

介绍

mem::transmute<T, U> 接受一个 T 类型的值,然后将它重新解析为类型 U。要求T和U的大小一样。
这种操作是非安全的行为,可能产生未定义的行为。

示例

1、字节到类型转换

u32::from_ne_bytes  从内存转换到native字节序列类型
u32::from_be_bytes 从内存转换到大端序列类型
u32::from_le_bytes 从内存转换到小端序列类型

2、transmute

pub const unsafe extern "rust-intrinsic" fn transmute<T, U>(e: T) -> U
将一种类型的值重新解释为另一种类型。它将源值中的位复制到目标值中,然后忘记原始值。

例子:

//std::mem::transmute
//将连续的字节转换成另外一个类型,会产生为定义的行为

fn main() {
	//let raw_bytes = [0x78, 0x56, 0x34, 0x12];
	let mut raw_bytes = [0x78, 0x56, 0x34, 0x12];
	let num = unsafe {
	    std::mem::transmute::<[u8; 4], u32>(raw_bytes)
	};
	let ret = u32::from_ne_bytes(raw_bytes);

	//assert_eq!(num, 0x12345678);
	assert_eq!(num, ret);
	println!("num = {}", num);
}

3、transmute_copy

pub unsafe fn transmute_copy<T, U>(src: &T) -> U
将src解释为&U类型,然后读取src的值。读取时是创建副本,而不是直接移动。

例子:

use std::mem;

#[repr(packed)]
struct Foo {
    bar: u8,
}

fn main() {
	let foo_array = [10u8];
	
	unsafe {
	    let mut foo_struct: Foo = mem::transmute_copy(&foo_array);
	    assert_eq!(foo_struct.bar, 10);
	
	    foo_struct.bar = 20;
	    assert_eq!(foo_struct.bar, 20);
	}
	
	assert_eq!(foo_array, [10]);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值