#rust
#Ржавчина
Вопрос:
Я пытаюсь реализовать std::io::Read
признак для структуры.
Моя цель — преобразовать obj в байтовый массив и прочитать его с помощью реализации Read trait.
Ниже приведен код, который я написал до сих пор.
use chrono::{DateTime, Utc};
use std::io::Error;
use std::io::Read;
use std::vec::Vec;
use std::str;
use super::{Chain, Transaction};
// The struct I need to convert to byte array and add the Read impl.
#[derive(Debug)]
pub struct Block {
index: u64,
timestamp: DateTime<Utc>,
transactions: Vec<Transaction>,
proof: i64,
previous_hash: String,
}
// The Read trait implementation for Block
impl Read for Block {
fn read(amp;mut self, buf: amp;mut [u8]) -> std::result::Result<usize, Error> {
let bytes: amp;[u8] = unsafe { any_as_u8_slice(amp;self) };
buf.clone_from_slice(bytes);
Ok(bytes.len())
}
}
// Function that converts to byte array. (found on stackoverflow)
unsafe fn any_as_u8_slice<T: Sized>(p: amp;T) -> amp;[u8] {
::std::slice::from_raw_parts((p as *const T) as *const u8, ::std::mem::size_of::<T>())
}
При выполнении кода таким образом я получаю сообщение об ошибке.
let mut buffer: Vec<u8> = Vec::new();
let result = block.read(buffer.as_mut());
ОШИБКА
поток ‘main’ запаниковал при ‘срезы назначения и источника имеют разную длину’, /Users/harsh/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/slice/mod.rs:2554:9
Я новичок в Rust, пытаюсь учиться, перенося другую программу на Rust.
Как мне скопировать amp;[u8] в другой amp;mut [u8], который является vec. (Исправить значение чтения для блока)?
И есть ли лучший способ сделать это? Преобразовать объект в байтовый массив и вернуть его из реализации чтения.
Комментарии:
1. TLDR, но, похоже, bincode может помочь.
2. Вы уверены, что это то, что вы хотите? Чтение необработанных байтов из a
Block
не будет содержать содержимогоtransactions
orprevious_hash
.3. Также
amp;[u8]
уже реализованоRead
, что вы можете использовать это вместо этого. Попытка реализоватьRead
подобное содержимое напрямую было бы в лучшем случае неудобно, посколькуRead
er должен отслеживать, что было прочитано, а что нет.4. ДА. Я заметил это. Спасибо. Я пытаюсь использовать bincode, чтобы разобраться в этом. Спасибо! @kmdreko