C++ int16 in zwei chars und zurück konvertieren?
Ich möchte in C++ einen int16 in einem char[] buffer speichern und das ganze dann auch wieder als int16 ausgeben. Ich nutze LoRa und bin deshalb genötigt einen 8 bit buffer zu benutzen. Wie kann ich das am besten umsetzen?
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