LINUX.ORG.RU

rust запись/чтение в бинарном виде

 ,


0

6

Уважаемые знатоки, подскажите пожалуйста, как в расте организовать сабж. Т.е. функция для записи в бинарном виде в файл требует &[u8]. Как скастовать к подобному виду структуру, или хотя бы простой тип вроде f64. Первое, что мне в голову пришло

let a : f64 = 1.001;
let data : &[u8] = mem::transmute(&a);
Но ведь слайсы в расте помимо данных хранять информацию о длине себя. Как в таком случае быть? Как правильно перевести структуру в байты и обратно? Ну или писать/читать в файл не только &[u8]?

★★★★★

Ответ на: комментарий от WatchCat
pub trait Write {
    fn write(&mut self, buf: &[u8]) -> Result<usize>;
    fn flush(&mut self) -> Result<()>;

    fn write_all(&mut self, buf: &[u8]) -> Result<()> { ... }
    fn write_fmt(&mut self, fmt: Arguments) -> Result<()> { ... }
    fn by_ref(&mut self) -> &mut Self where Self: Sized { ... }
    fn broadcast<W: Write>(self, other: W) -> Broadcast<Self, W> where Self: Sized { ... }
}
fn write(&mut self, buf: &[u8]) -> Result<usize>;

Нет же, нужно &[u8].

Aswed ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

ровно как и read

fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
Работает только с &[u8]

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Я отвечал на это:

Но ведь слайсы в расте помимо данных хранять информацию о длине себя.

Что по поводу конвертации.
Я создавал в unsafe слайсы с указателем на структуру.
Просто сейчас нет рабочего компа под рукой чтобы показать рабочий код.

WatchCat ★★★★★
()

Во, нашёл чем пользовался - from_raw_parts.

use std::slice;

// manifest a slice out of thin air!
let ptr = 0x1234 as *const usize;
let amt = 10;
unsafe {
    let slice = slice::from_raw_parts(ptr, amt);
}

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от quantum-troll

Спасибо. Это то, что нужно.

Aswed ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.