18#ifndef PACS_ENCODING_BYTE_SWAP_HPP
19#define PACS_ENCODING_BYTE_SWAP_HPP
40[[nodiscard]]
constexpr uint16_t
byte_swap16(uint16_t value)
noexcept {
41 return static_cast<uint16_t
>((value >> 8) | (value << 8));
51[[nodiscard]]
constexpr uint32_t
byte_swap32(uint32_t value)
noexcept {
52 return ((value >> 24) & 0x000000FF) |
53 ((value >> 8) & 0x0000FF00) |
54 ((value << 8) & 0x00FF0000) |
55 ((value << 24) & 0xFF000000);
65[[nodiscard]]
constexpr uint64_t
byte_swap64(uint64_t value)
noexcept {
66 return ((value >> 56) & 0x00000000000000FF) |
67 ((value >> 40) & 0x000000000000FF00) |
68 ((value >> 24) & 0x0000000000FF0000) |
69 ((value >> 8) & 0x00000000FF000000) |
70 ((value << 8) & 0x000000FF00000000) |
71 ((value << 24) & 0x0000FF0000000000) |
72 ((value << 40) & 0x00FF000000000000) |
73 ((value << 56) & 0xFF00000000000000);
86[[nodiscard]]
constexpr uint16_t
read_be16(
const uint8_t* data)
noexcept {
87 return (
static_cast<uint16_t
>(data[0]) << 8) |
88 static_cast<uint16_t
>(data[1]);
96[[nodiscard]]
constexpr uint32_t
read_be32(
const uint8_t* data)
noexcept {
97 return (
static_cast<uint32_t
>(data[0]) << 24) |
98 (
static_cast<uint32_t
>(data[1]) << 16) |
99 (
static_cast<uint32_t
>(data[2]) << 8) |
100 static_cast<uint32_t
>(data[3]);
108[[nodiscard]]
constexpr uint64_t
read_be64(
const uint8_t* data)
noexcept {
109 return (
static_cast<uint64_t
>(data[0]) << 56) |
110 (
static_cast<uint64_t
>(data[1]) << 48) |
111 (
static_cast<uint64_t
>(data[2]) << 40) |
112 (
static_cast<uint64_t
>(data[3]) << 32) |
113 (
static_cast<uint64_t
>(data[4]) << 24) |
114 (
static_cast<uint64_t
>(data[5]) << 16) |
115 (
static_cast<uint64_t
>(data[6]) << 8) |
116 static_cast<uint64_t
>(data[7]);
124inline void write_be16(std::vector<uint8_t>& buffer, uint16_t value) {
125 buffer.push_back(
static_cast<uint8_t
>((value >> 8) & 0xFF));
126 buffer.push_back(
static_cast<uint8_t
>(value & 0xFF));
134inline void write_be32(std::vector<uint8_t>& buffer, uint32_t value) {
135 buffer.push_back(
static_cast<uint8_t
>((value >> 24) & 0xFF));
136 buffer.push_back(
static_cast<uint8_t
>((value >> 16) & 0xFF));
137 buffer.push_back(
static_cast<uint8_t
>((value >> 8) & 0xFF));
138 buffer.push_back(
static_cast<uint8_t
>(value & 0xFF));
146inline void write_be64(std::vector<uint8_t>& buffer, uint64_t value) {
147 buffer.push_back(
static_cast<uint8_t
>((value >> 56) & 0xFF));
148 buffer.push_back(
static_cast<uint8_t
>((value >> 48) & 0xFF));
149 buffer.push_back(
static_cast<uint8_t
>((value >> 40) & 0xFF));
150 buffer.push_back(
static_cast<uint8_t
>((value >> 32) & 0xFF));
151 buffer.push_back(
static_cast<uint8_t
>((value >> 24) & 0xFF));
152 buffer.push_back(
static_cast<uint8_t
>((value >> 16) & 0xFF));
153 buffer.push_back(
static_cast<uint8_t
>((value >> 8) & 0xFF));
154 buffer.push_back(
static_cast<uint8_t
>(value & 0xFF));
171 std::span<const uint8_t> data) {
172 std::vector<uint8_t> result(data.size());
186 std::span<const uint8_t> data) {
187 std::vector<uint8_t> result(data.size());
200 std::span<const uint8_t> data) {
213 std::span<const uint8_t> data) {
214 std::vector<uint8_t> result(data.size());
227 std::span<const uint8_t> data) {
242 std::span<const uint8_t> data) {
252 std::span<const uint8_t> data) {
262 std::span<const uint8_t> data) {
272 std::span<const uint8_t> data) {
282 std::span<const uint8_t> data) {
292 std::span<const uint8_t> data) {
void swap_bytes_32_simd(const uint8_t *src, uint8_t *dst, size_t count) noexcept
Swap bytes in 32-bit words using best available SIMD.
void swap_bytes_64_simd(const uint8_t *src, uint8_t *dst, size_t count) noexcept
Swap bytes in 64-bit words using best available SIMD.
void swap_bytes_16_simd(const uint8_t *src, uint8_t *dst, size_t count) noexcept
Swap bytes in 16-bit words using best available SIMD.
std::vector< uint8_t > swap_fl_bytes(std::span< const uint8_t > data)
Swaps bytes for FL (Float) value in raw data.
constexpr uint32_t read_be32(const uint8_t *data) noexcept
Reads a 32-bit value from big-endian bytes.
constexpr uint64_t byte_swap64(uint64_t value) noexcept
Swaps bytes in a 64-bit value.
std::vector< uint8_t > swap_ul_bytes(std::span< const uint8_t > data)
Swaps bytes for UL (Unsigned Long) value in raw data.
constexpr uint32_t byte_swap32(uint32_t value) noexcept
Swaps bytes in a 32-bit value.
std::vector< uint8_t > swap_od_bytes(std::span< const uint8_t > data)
Swaps bytes in-place for OD (Other Double) data.
std::vector< uint8_t > swap_us_bytes(std::span< const uint8_t > data)
Swaps bytes for US (Unsigned Short) value in raw data.
std::vector< uint8_t > swap_ow_bytes(std::span< const uint8_t > data)
Swaps bytes in-place for OW (Other Word) data.
std::vector< uint8_t > swap_fd_bytes(std::span< const uint8_t > data)
Swaps bytes for FD (Double) value in raw data.
void write_be64(std::vector< uint8_t > &buffer, uint64_t value)
Writes a 64-bit value in big-endian byte order.
std::vector< uint8_t > swap_at_bytes(std::span< const uint8_t > data)
Swaps bytes for AT (Attribute Tag) data.
void write_be32(std::vector< uint8_t > &buffer, uint32_t value)
Writes a 32-bit value in big-endian byte order.
void write_be16(std::vector< uint8_t > &buffer, uint16_t value)
Writes a 16-bit value in big-endian byte order.
std::vector< uint8_t > swap_sl_bytes(std::span< const uint8_t > data)
Swaps bytes for SL (Signed Long) value in raw data.
constexpr uint16_t read_be16(const uint8_t *data) noexcept
Reads a 16-bit value from big-endian bytes.
std::vector< uint8_t > swap_ss_bytes(std::span< const uint8_t > data)
Swaps bytes for SS (Signed Short) value in raw data.
constexpr uint64_t read_be64(const uint8_t *data) noexcept
Reads a 64-bit value from big-endian bytes.
constexpr uint16_t byte_swap16(uint16_t value) noexcept
Swaps bytes in a 16-bit value.
std::vector< uint8_t > swap_ol_bytes(std::span< const uint8_t > data)
Swaps bytes in-place for OL (Other Long) data.
std::vector< uint8_t > swap_of_bytes(std::span< const uint8_t > data)
Swaps bytes in-place for OF (Other Float) data.
Common SIMD utility functions.