C++ int16 in zwei chars und zurück konvertieren?

2 Antworten

Schaue dir std::stringstream und dessen Operatoren << beziehungsweise >> an.

Woher ich das weiß:Hobby

In C++ gibt es viele Wege, Integer in Char-Puffer zu schreiben.

Ein c-artiger Cast, sowie reinterpret_cast sind möglich, können aber unabhängig davon, ob du sie richtig verwendest, UB sein. Folgendes ist bei korrekter Verwendung sicher:

#include <cstdint> // für uint16_t
#include <cstdio>  // für printf
#include <cstring> // für memcpy
#include <bit>     // für bit_cast (seit c++20!)

// c-artige Methode ohne UB, solange `buf` richtig zugeordnet wurde
void print_a(char buf[]) {
  uint16_t a = 0;
  std::memcpy(&a, buf, sizeof(a));

  std::printf("a: %d\n", a);
}

// c++20
void print_b(char buf[]) {
  uint16_t *b = std::bit_cast<uint16_t *>(buf);
  std::printf("b: %d\n", *b);
}

// Bit-Arithmetik
void print_c(char buf[]) {
  uint16_t c = (buf[0] & 0xFF) | ((buf[1] << 8) & 0xff00);
  std::printf("c: %d\n", c);
}

int main(void) {
  uint16_t a = 16002;
  uint16_t b = 5824;
  uint16_t c = 3725;

  char buf_a[2] = {};
  std::memcpy(buf_a, &a, sizeof(buf_a));
  print_a(buf_a);

  char *buf_b = std::bit_cast<char *>(&b);
  print_b(buf_b);

  char buf_c[2] = {};
  buf_c[0] = c & 0xFF;
  buf_c[1] = (c >> 8) & 0xFF;
  print_c(buf_c);

  return 0;
}

Ausgabe mit "clang++ test.cpp -std=c++20 -O -Wall -Wextra -Wpedantic -fsanitize=address -fsanitize=undefined -fsanitize=leak -fstack-protector-all && ./a.out":

a: 16002
b: 5824
c: 3725
Woher ich das weiß:eigene Erfahrung – Langjähriger Poweruser & praktische Programmiererfahrung