Различные представления
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let c_repr = b"Hello, C\0";
let cc_repr = (b"Hello, C++\0", 10u32);
let rust_repr = (b"Hello, Rust", 11);
}
Каждый язык по-своему решает, как что-то реализовать, что может приводить к путанице и ошибкам. Рассмотрим три способа представить текст.
Покажите, как преобразовать сырые представления в строковый срез Rust:
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
// Представление C → Rust
unsafe {
let ptr = c_repr.as_ptr() as *const i8;
let c: &str = std::ffi::CStr::from_ptr(ptr).to_str().unwrap();
println!("{c}");
};
// Представление C++ → Rust
unsafe {
let ptr = cc_repr.0.as_ptr();
let bytes = std::slice::from_raw_parts(ptr, cc_repr.1);
let cc: &str = std::str::from_utf8_unchecked(bytes);
println!("{cc}");
};
// Представление Rust (байты) → строковый срез
unsafe {
let ptr = rust_repr.0.as_ptr();
let bytes = std::slice::from_raw_parts(ptr, rust_repr.1);
let rust: &str = std::str::from_utf8_unchecked(bytes);
println!("{rust}");
};
Замечание: в Rust есть строковый литерал с префиксом c. Он добавляет нулевой байт в конец, например c"Rust" == b"Rust\0".