zerocopy
این crate zerocopy (از Fuchsia) صفات و ماکروهایی را برای تبدیل ایمن بین دنبالههای بایت و انواع دیگر فراهم میکند.
use zerocopy::AsBytes;
#[repr(u32)]
#[derive(AsBytes, Debug, Default)]
enum RequestType {
#[default]
In = 0,
Out = 1,
Flush = 4,
}
#[repr(C)]
#[derive(AsBytes, Debug, Default)]
struct VirtioBlockRequest {
request_type: RequestType,
reserved: u32,
sector: u64,
}
fn main() {
let request = VirtioBlockRequest {
request_type: RequestType::Flush,
sector: 42,
..Default::default()
};
assert_eq!(
request.as_bytes(),
&[4, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0]
);
}
این برای MMIO مناسب نیست (زیرا از خواندن و نوشتن فرار یا volatile استفاده نمیکند)، اما میتواند برای کار با ساختارهای مشترک با سخت افزار مفید باشد. توسط DMA، یا از طریق برخی از رابطهای خارجی ارسال میشود.
-
FromBytesرا میتوان برای انواعی که هر الگوی بایتی برای آنها معتبر است پیادهسازی کرد و بنابراین میتوان با خیال راحت از یک دنباله بایتهای نامعتبر تبدیل کرد. - تلاش برای استخراج
FromBytesبرای این تایپها ناموفق خواهد بود، زیراRequestTypeاز همه مقادیر ممکن u32 به عنوان متمایزکننده استفاده نمیکند، بنابراین همه الگوهای بایت معتبر نیستند. zerocopy::byteorderدارای تایپهای برای اعداد اولیه مطلع از byte-order است.- مثال را با
cargo runدرsrc/bare-metal/useful-crates/zerocopy-example/اجرا کنید. (به دلیل وابستگی به crate در Playground اجرا نمیشود.)