Функция transmute
Функция transmute выполняет небезопасное преобразование значения из одного типа в другой, интерпретируя его битовое представление в новом типе. Она объявлена как unsafe, потому что компилятор не может проверить корректность такого преобразования. Параметром функция принимает значение исходного типа, а тип результата указывается явно через аннотацию или турборыбку.
Функция transmute требует, чтобы размеры исходного и целевого типов совпадали. Если размеры различаются, код не скомпилируется. Однако совпадения размеров недостаточно для безопасности: преобразование должно быть логически корректным для конкретного типа, иначе поведение программы становится непредсказуемым.
Синтаксис
unsafe { std::mem::transmute::<From, To>(value) }
Пример
Давайте преобразуем число типа u32 в массив из четырёх байтов [u8; 4]:
fn main()
{
let num: u32 = 0x12345678;
let bytes: [u8; 4] = unsafe { std::mem::transmute(num) };
println!("{:?}", bytes);
}
Результат выполнения кода:
[120, 86, 52, 18]
Пример
Давайте преобразуем массив из четырёх байтов [u8; 4] обратно в число типа u32:
fn main()
{
let bytes: [u8; 4] = [120, 86, 52, 18];
let num: u32 = unsafe { std::mem::transmute(bytes) };
println!("{:#X}", num);
}
Результат выполнения кода:
0x12345678
Пример
Давайте преобразуем число типа f32 в его битовое представление типа u32:
fn main()
{
let float: f32 = 1.0;
let bits: u32 = unsafe { std::mem::transmute(float) };
println!("{:#X}", bits);
}
Результат выполнения кода:
0x3F800000
Смотрите также
-
функция
transmute_copy,
которая выполняет преобразование типа без проверки размера -
функция
size_of,
которая возвращает размер типа в байтах -
функция
MaybeUninit,
которая позволяет работать с неинициализированной памятью -
ключевое слово
unsafe,
которое открывает доступ к небезопасным операциям