Тип CStr
Тип CStr - это обёртка над C-строкой,
то есть над последовательностью байтов,
которая заканчивается нулевым байтом \0.
В отличие от String и str,
значения CStr не владеют своими данными,
а лишь ссылаются на уже существующую память.
Этот тип используется при взаимодействии
с функциями языка C через FFI. Получить
значение CStr можно с помощью
метода from_ptr или из типа CString.
Работа с CStr помечена как unsafe,
поскольку он не гарантирует корректность
указателя и наличие нулевого байта.
Синтаксис
use std::ffi::CStr;
let c_str: &CStr = unsafe { CStr::from_ptr(ptr) };
Пример
Давайте создадим C-строку из байтового массива
с нулевым байтом и получим её через from_ptr:
use std::ffi::CStr;
use std::os::raw::c_char;
fn main()
{
let bytes: [u8; 6] = [b'a', b'b', b'c', b'd', b'e', 0];
let ptr = bytes.as_ptr() as *const c_char;
let c_str = unsafe { CStr::from_ptr(ptr) };
println!("{:?}", c_str);
}
Результат выполнения кода:
"abcde"
Пример
Давайте преобразуем CStr в обычную строку
&str с помощью метода to_str:
use std::ffi::CStr;
use std::os::raw::c_char;
fn main()
{
let bytes: [u8; 6] = [b'1', b'2', b'3', b'4', b'5', 0];
let ptr = bytes.as_ptr() as *const c_char;
let c_str = unsafe { CStr::from_ptr(ptr) };
let res = c_str.to_str().unwrap();
println!("{}", res);
}
Результат выполнения кода:
"12345"
Пример
Давайте получим байты C-строки без нулевого байта
с помощью метода to_bytes:
use std::ffi::CStr;
use std::os::raw::c_char;
fn main()
{
let bytes: [u8; 6] = [b'a', b'b', b'c', b'd', b'e', 0];
let ptr = bytes.as_ptr() as *const c_char;
let c_str = unsafe { CStr::from_ptr(ptr) };
let res = c_str.to_bytes();
println!("{:?}", res);
}
Результат выполнения кода:
[97, 98, 99, 100, 101]