.. _module-pw_bytes:

========
pw_bytes
========
.. pigweed-module::
   :name: pw_bytes

- **Type-safe**: Work with binary data using ``std::byte``.
- **Compile-time**: Construct and validate byte arrays at compile time.
- **Convenient**: Easily handle endianness, alignment, and byte units.

``pw_bytes`` is a collection of utilities for robust and efficient
manipulation of binary data in C++. It provides tools for constructing
byte arrays at compile time, handling data alignment, converting
endianness, and defining byte quantities with clear, standard units.

.. code-block:: cpp

   #include "pw_bytes/array.h"
   #include "pw_bytes/endian.h"
   #include "pw_bytes/units.h"

   // Clearly define buffer sizes with IEC units.
   using namespace pw::bytes::unit_literals;
   constexpr size_t kTelemetryPacketMaxSize = 1_KiB;

   // Construct byte arrays at compile time.
   constexpr auto kHeader = pw::bytes::Array<'P', 'W', 'R', 'D'>;
   constexpr uint32_t kPayloadId = 0x12345678;

   // Combine data with specified endianness.
   constexpr auto kPacketPrefix = pw::bytes::Concat(
       kHeader,
       pw::bytes::CopyInOrder(pw::endian::big, kPayloadId));

   // kPacketPrefix now contains:
   // {'P', 'W', 'R', 'D', 0x12, 0x34, 0x56, 0x78}

Check out :ref:`module-pw_bytes-guide` for more code samples.

.. admonition:: Is it right for you?
   :class: tip

   ``pw_bytes`` is useful any time you need to work with raw binary data,
   manage memory layout precisely, or ensure type safety at the byte level
   in embedded C++.

   If your project primarily deals with high-level data structures and doesn't
   require direct byte manipulation, other Pigweed modules or standard library
   features might be more suitable.

   ``pw_bytes`` utilities are designed to be lightweight and can be beneficial
   even in less resource-constrained environments by improving code clarity
   and safety when dealing with binary data.

.. grid:: 2

   .. grid-item-card:: :octicon:`rocket` Quickstart & guides
      :link: module-pw_bytes-guide
      :link-type: ref
      :class-item: sales-pitch-cta-primary

      Integrate pw_bytes into your project and learn common use cases

   .. grid-item-card:: :octicon:`code-square` API reference
      :link: ../doxygen/group__pw__bytes.html
      :link-type: url
      :class-item: sales-pitch-cta-secondary

      Detailed description of the pw_bytes interface

.. grid:: 2

   .. grid-item-card:: :octicon:`code-square` Design & roadmap
      :link: module-pw_bytes-design
      :link-type: ref
      :class-item: sales-pitch-cta-secondary

      Learn why pw_bytes is designed the way it is, and upcoming plans

   .. grid-item-card:: :octicon:`graph` Code size analysis
      :link: module-pw_bytes-code-size
      :link-type: ref
      :class-item: sales-pitch-cta-secondary

      Understand pw_bytes's code footprint

------------
Dependencies
------------
* ``pw_preprocessor``
* ``pw_status``
* ``pw_span``

------
Zephyr
------
To enable ``pw_bytes`` for Zephyr add ``CONFIG_PIGWEED_BYTES=y`` to the
project's configuration.

--------
Rust API
--------
``pw_bytes``'s Rust API is documented in our
`rustdoc API docs </rustdoc/pw_bytes/>`_.

.. toctree::
   :hidden:
   :maxdepth: 1

   code_size
   design
   guide
