Trait s2n_codec::zerocopy::AsBytes

source ·
pub unsafe trait AsBytes {
    // Provided methods
    fn as_bytes(&self) -> &[u8]  { ... }
    fn as_bytes_mut(&mut self) -> &mut [u8] 
       where Self: FromBytes { ... }
    fn write_to(&self, bytes: &mut [u8]) -> Option<()> { ... }
    fn write_to_prefix(&self, bytes: &mut [u8]) -> Option<()> { ... }
    fn write_to_suffix(&self, bytes: &mut [u8]) -> Option<()> { ... }
}
Expand description

Types that can be viewed as an immutable slice of initialized bytes.

Any AsBytes type can be viewed as a slice of initialized bytes of the same size. This is useful for efficiently serializing structured data as raw bytes.

§Implementation

Do not implement this trait yourself! Instead, use #[derive(AsBytes)] (requires the derive Cargo feature); e.g.:

#[derive(AsBytes)]
#[repr(C)]
struct MyStruct {
    ...
}

#[derive(AsBytes)]
#[repr(u8)]
enum MyEnum {
    ...
}

#[derive(AsBytes)]
#[repr(C)]
union MyUnion {
    ...
}

This derive performs a sophisticated, compile-time safety analysis to determine whether a type is AsBytes. See the derive documentation for guidance on how to interpret error messages produced by the derive’s analysis.

§Safety

This section describes what is required in order for T: AsBytes, and what unsafe code may assume of such types. If you don’t plan on implementing AsBytes manually, and you don’t plan on writing unsafe code that operates on AsBytes types, then you don’t need to read this section.

If T: AsBytes, then unsafe code may assume that:

  • It is sound to treat any t: T as an immutable [u8] of length size_of_val(t).
  • Given t: &T, it is sound to construct a b: &[u8] where b.len() == size_of_val(t) at the same address as t, and it is sound for both b and t to be live at the same time.

If a type is marked as AsBytes which violates this contract, it may cause undefined behavior.

#[derive(AsBytes)] only permits types which satisfy these requirements.

Provided Methods§

source

fn as_bytes(&self) -> &[u8]

Gets the bytes of this value.

as_bytes provides access to the bytes of this value as an immutable byte slice.

§Examples
use zerocopy::AsBytes;

#[derive(AsBytes)]
#[repr(C)]
struct PacketHeader {
    src_port: [u8; 2],
    dst_port: [u8; 2],
    length: [u8; 2],
    checksum: [u8; 2],
}

let header = PacketHeader {
    src_port: [0, 1],
    dst_port: [2, 3],
    length: [4, 5],
    checksum: [6, 7],
};

let bytes = header.as_bytes();

assert_eq!(bytes, [0, 1, 2, 3, 4, 5, 6, 7]);
source

fn as_bytes_mut(&mut self) -> &mut [u8]
where Self: FromBytes,

Gets the bytes of this value mutably.

as_bytes_mut provides access to the bytes of this value as a mutable byte slice.

§Examples
use zerocopy::AsBytes;

#[derive(AsBytes, FromZeroes, FromBytes)]
#[repr(C)]
struct PacketHeader {
    src_port: [u8; 2],
    dst_port: [u8; 2],
    length: [u8; 2],
    checksum: [u8; 2],
}

let mut header = PacketHeader {
    src_port: [0, 1],
    dst_port: [2, 3],
    length: [4, 5],
    checksum: [6, 7],
};

let bytes = header.as_bytes_mut();

assert_eq!(bytes, [0, 1, 2, 3, 4, 5, 6, 7]);

bytes.reverse();

assert_eq!(header, PacketHeader {
    src_port: [7, 6],
    dst_port: [5, 4],
    length: [3, 2],
    checksum: [1, 0],
});
source

fn write_to(&self, bytes: &mut [u8]) -> Option<()>

Writes a copy of self to bytes.

If bytes.len() != size_of_val(self), write_to returns None.

§Examples
use zerocopy::AsBytes;

#[derive(AsBytes)]
#[repr(C)]
struct PacketHeader {
    src_port: [u8; 2],
    dst_port: [u8; 2],
    length: [u8; 2],
    checksum: [u8; 2],
}

let header = PacketHeader {
    src_port: [0, 1],
    dst_port: [2, 3],
    length: [4, 5],
    checksum: [6, 7],
};

let mut bytes = [0, 0, 0, 0, 0, 0, 0, 0];

header.write_to(&mut bytes[..]);

assert_eq!(bytes, [0, 1, 2, 3, 4, 5, 6, 7]);

If too many or too few target bytes are provided, write_to returns None and leaves the target bytes unmodified:

let mut excessive_bytes = &mut [0u8; 128][..];

let write_result = header.write_to(excessive_bytes);

assert!(write_result.is_none());
assert_eq!(excessive_bytes, [0u8; 128]);
source

fn write_to_prefix(&self, bytes: &mut [u8]) -> Option<()>

Writes a copy of self to the prefix of bytes.

write_to_prefix writes self to the first size_of_val(self) bytes of bytes. If bytes.len() < size_of_val(self), it returns None.

§Examples
use zerocopy::AsBytes;

#[derive(AsBytes)]
#[repr(C)]
struct PacketHeader {
    src_port: [u8; 2],
    dst_port: [u8; 2],
    length: [u8; 2],
    checksum: [u8; 2],
}

let header = PacketHeader {
    src_port: [0, 1],
    dst_port: [2, 3],
    length: [4, 5],
    checksum: [6, 7],
};

let mut bytes = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

header.write_to_prefix(&mut bytes[..]);

assert_eq!(bytes, [0, 1, 2, 3, 4, 5, 6, 7, 0, 0]);

If insufficient target bytes are provided, write_to_prefix returns None and leaves the target bytes unmodified:

let mut insufficent_bytes = &mut [0, 0][..];

let write_result = header.write_to_suffix(insufficent_bytes);

assert!(write_result.is_none());
assert_eq!(insufficent_bytes, [0, 0]);
source

fn write_to_suffix(&self, bytes: &mut [u8]) -> Option<()>

Writes a copy of self to the suffix of bytes.

write_to_suffix writes self to the last size_of_val(self) bytes of bytes. If bytes.len() < size_of_val(self), it returns None.

§Examples
use zerocopy::AsBytes;

#[derive(AsBytes)]
#[repr(C)]
struct PacketHeader {
    src_port: [u8; 2],
    dst_port: [u8; 2],
    length: [u8; 2],
    checksum: [u8; 2],
}

let header = PacketHeader {
    src_port: [0, 1],
    dst_port: [2, 3],
    length: [4, 5],
    checksum: [6, 7],
};

let mut bytes = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

header.write_to_suffix(&mut bytes[..]);

assert_eq!(bytes, [0, 0, 0, 1, 2, 3, 4, 5, 6, 7]);

let mut insufficent_bytes = &mut [0, 0][..];

let write_result = header.write_to_suffix(insufficent_bytes);

assert!(write_result.is_none());
assert_eq!(insufficent_bytes, [0, 0]);

If insufficient target bytes are provided, write_to_suffix returns None and leaves the target bytes unmodified:

let mut insufficent_bytes = &mut [0, 0][..];

let write_result = header.write_to_suffix(insufficent_bytes);

assert!(write_result.is_none());
assert_eq!(insufficent_bytes, [0, 0]);

Implementations on Foreign Types§

source§

impl AsBytes for Option<NonZero<i8>>

source§

impl AsBytes for Option<NonZero<i16>>

source§

impl AsBytes for Option<NonZero<i32>>

source§

impl AsBytes for Option<NonZero<i64>>

source§

impl AsBytes for Option<NonZero<i128>>

source§

impl AsBytes for Option<NonZero<isize>>

source§

impl AsBytes for Option<NonZero<u8>>

source§

impl AsBytes for Option<NonZero<u16>>

source§

impl AsBytes for Option<NonZero<u32>>

source§

impl AsBytes for Option<NonZero<u64>>

source§

impl AsBytes for Option<NonZero<u128>>

source§

impl AsBytes for Option<NonZero<usize>>

source§

impl AsBytes for bool

source§

impl AsBytes for char

source§

impl AsBytes for f32

source§

impl AsBytes for f64

source§

impl AsBytes for i8

source§

impl AsBytes for i16

source§

impl AsBytes for i32

source§

impl AsBytes for i64

source§

impl AsBytes for i128

source§

impl AsBytes for isize

source§

impl AsBytes for str

source§

impl AsBytes for u8

source§

impl AsBytes for u16

source§

impl AsBytes for u32

source§

impl AsBytes for u64

source§

impl AsBytes for u128

source§

impl AsBytes for ()

source§

impl AsBytes for usize

source§

impl AsBytes for NonZero<i8>

source§

impl AsBytes for NonZero<i16>

source§

impl AsBytes for NonZero<i32>

source§

impl AsBytes for NonZero<i64>

source§

impl AsBytes for NonZero<i128>

source§

impl AsBytes for NonZero<isize>

source§

impl AsBytes for NonZero<u8>

source§

impl AsBytes for NonZero<u16>

source§

impl AsBytes for NonZero<u32>

source§

impl AsBytes for NonZero<u64>

source§

impl AsBytes for NonZero<u128>

source§

impl AsBytes for NonZero<usize>

source§

impl<T> AsBytes for [T]
where T: AsBytes,

source§

impl<T> AsBytes for PhantomData<T>
where T: ?Sized,

source§

impl<T> AsBytes for ManuallyDrop<T>
where T: AsBytes + ?Sized,

source§

impl<T> AsBytes for Wrapping<T>
where T: AsBytes,

source§

impl<const N: usize, T> AsBytes for [T; N]
where T: AsBytes,

Implementors§

source§

impl AsBytes for s2n_codec::zerocopy::I16
where I16<NetworkEndian>: AsBytes, HasPadding<I16, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::I32
where I32<NetworkEndian>: AsBytes, HasPadding<I32, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::I64
where I64<NetworkEndian>: AsBytes, HasPadding<I64, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::I128
where I128<NetworkEndian>: AsBytes, HasPadding<I128, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::U16
where U16<NetworkEndian>: AsBytes, HasPadding<U16, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::U32
where U32<NetworkEndian>: AsBytes, HasPadding<U32, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::U64
where U64<NetworkEndian>: AsBytes, HasPadding<U64, { _ }>: ShouldBe<false>,

source§

impl AsBytes for s2n_codec::zerocopy::U128
where U128<NetworkEndian>: AsBytes, HasPadding<U128, { _ }>: ShouldBe<false>,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::I16<O>
where [u8; 2]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::I32<O>
where [u8; 4]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::I64<O>
where [u8; 8]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::I128<O>
where [u8; 16]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::U16<O>
where [u8; 2]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::U32<O>
where [u8; 4]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::U64<O>
where [u8; 8]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for s2n_codec::zerocopy::byteorder::U128<O>
where [u8; 16]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for F32<O>
where [u8; 4]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<O> AsBytes for F64<O>
where [u8; 8]: AsBytes, PhantomData<O>: AsBytes,

source§

impl<T> AsBytes for Unalign<T>
where T: AsBytes,