A header-only C++17 library for converting between base data types and byte sequences, with explicit endianness control. Inspired by the C# BitConverter class.
- Convert integers (16/32/64-bit, signed and unsigned) to/from bytes
- Convert floating-point values (32-bit and 64-bit) to/from bytes
- Explicit big-endian / little-endian support
- Header-only, no dependencies
- Correct handling of IEEE 754 special values (zero, subnormal, infinity, NaN)
Copy the header file include/bit_converter/bit_converter.hpp to your project. Requires C++17.
Convert a 32-bit signed integer to bytes (big-endian):
#include "bit_converter/bit_converter.hpp"
#include <vector>
std::vector<uint8_t> bytes(sizeof(int32_t));
bit_converter::i32_to_bytes(94356, true, bytes.begin());
// bytes: {0, 1, 112, 52}Convert bytes to a double-precision floating-point value (little-endian):
std::vector<uint8_t> bytes{31, 133, 235, 81, 184, 30, 9, 64};
double_t value = bit_converter::bytes_to_f64(bytes.begin(), false);
// value: 3.14/**
* @brief Convert the specified 16-bit signed integer value to bytes.
*/
template <typename OutputIt>
inline OutputIt i16_to_bytes(int16_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified 16-bit unsigned integer value to bytes.
*/
template <typename OutputIt>
inline OutputIt u16_to_bytes(uint16_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified 32-bit signed integer value to bytes.
*/
template <typename OutputIt>
inline OutputIt i32_to_bytes(int32_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified 32-bit unsigned integer value to bytes.
*/
template <typename OutputIt>
inline OutputIt u32_to_bytes(uint32_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified 64-bit signed integer value to bytes.
*/
template <typename OutputIt>
inline OutputIt i64_to_bytes(int64_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified 64-bit unsigned integer value to bytes.
*/
template <typename OutputIt>
inline OutputIt u64_to_bytes(uint64_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified single-precision floating-point value to bytes.
*/
template <typename OutputIt>
inline OutputIt f32_to_bytes(float_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Convert the specified double-precision floating-point value to bytes.
*/
template <typename OutputIt>
inline OutputIt f64_to_bytes(double_t value, bool is_big_endian,
OutputIt output_it);
/**
* @brief Returns a 16-bit signed integer converted from two bytes at a
* specified position in a byte sequence.
*/
template <typename InputIt>
inline int16_t bytes_to_i16(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a 16-bit unsigned integer converted from two bytes at a
* specified position in a byte sequence.
*/
template <typename InputIt>
inline uint16_t bytes_to_u16(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a 32-bit signed integer converted from four bytes at a
* specified position in a byte sequence.
*/
template <typename InputIt>
inline int32_t bytes_to_i32(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a 32-bit unsigned integer converted from four bytes at a
* specified position in a byte sequence.
*/
template <typename InputIt>
inline uint32_t bytes_to_u32(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a 64-bit signed integer converted from eight bytes at a
* specified position in a byte sequence.
*/
template <typename InputIt>
inline int64_t bytes_to_i64(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a 64-bit unsigned integer converted from eight bytes at a
* specified position in a byte sequence.
*/
template <typename InputIt>
inline uint64_t bytes_to_u64(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a single-precision floating-point number converted from four
* bytes at a specified position in a byte sequence.
*/
template <typename InputIt>
inline float_t bytes_to_f32(InputIt input_it, bool is_big_endian);
/**
* @brief Returns a double-precision floating-point number converted from eight
* bytes at a specified position in a byte sequence.
*/
template <typename InputIt>
inline double_t bytes_to_f64(InputIt input_it, bool is_big_endian);- Install xmake
- Build and run:
xmake
xmake run BitConverter