Künstliche Intelligenz
Top 10: Die beste Powerbank im Test – Testsieger Anker für 24 Euro
Powerbanks gibt es von 10 bis 200 W und 5000 bis 27.000 mAh. Wir haben über 30 Modelle getestet und zeigen die besten Geräte aller Preisklassen.
Akkus in Handys halten, egal wie groß, nie lang genug. Eine praktische Lösung für mehr Akkulaufzeit unterwegs sind deshalb Powerbanks. Die mobilen Ladestationen, meist selbst nicht mehr als eine dicke Batterie, haben es sogar zu einer musikalischen Liebeserklärung der Band Deichkind geschafft, die im Song Powerbank „dieses Ding mehr als ihr Girlfriend“ lieben.
Im Jahr 2026 ist eine Powerbank aber nicht mehr nur der Retter eines Smartphones in der Not, sondern deutlich vielseitiger. Von günstig bis richtig stark ist alles dabei. Wir zeigen, welche Powerbanks über alle Preisbereiche hinweg die besten sind.
Welche ist die beste Powerbank?
Kapazität und Ausgangsspannung
Die wichtigste Kenngröße der Powerbank ist wahrscheinlich: „Wie groß ist sie?“ Das bezieht sich auf zwei Punkte, die Kapazität sowie die eigentliche Größe der mobilen Batterie. Beides hängt zusammen. Je mehr Kapazität, desto mehr – oder größere – Zellen gibt es, womit die Powerbank „größer“ wird. Natürlich gibt es auch kompaktere Varianten, irgendwann stößt man aber an physikalische Grenzen.
Die Kapazität geben Hersteller meistens in Milliamperestunden (mAh) an, einfach, weil 10.000 mAh deutlich eindrucksvoller aussehen als 10 Amperestunden (Ah). Bei Handy-Akkus ist es ebenso, insofern ist das kein großes Problem. Wer eine besonders handliche Powerbank haben will, dem reichen auch Kapazitäten unter 5000 mAh. Die Modelle sind deutlich kompakter und leichter als Powerbanks über 10.000 mAh. Allerdings schafft man damit je nach Akkugröße des Handys maximal einen Ladevorgang oder weniger.
Bei der Kapazität ist zudem zu beachten, dass es für die Mitnahme im Flugzeug Auflagen gibt. So dürfen Powerbanks im Handgepäck eine maximale Kapazität von 100 Wattstunden haben. Überwiegend wird die Kapazität nur plakativ in Milliamperestunden (mAh) angegeben und nicht in Wattstunden (Wh). Mehr zu der Problematik erklärt der Artikel der Kollegen von heise tipps+tricks.
Neben der Kapazität ist die Ausgangsleistung (angegeben in Watt) an den einzelnen Anschlüssen wichtig. Dabei sollte man etwas aufpassen, gerade bei günstigen Produkten schaffen die Ports die Nennleistung nicht jeweils, sondern nur gemeinsam. Je geringer die Leistung, desto länger dauert das Laden. Sind die Geräte besonders stromhungrig, kann es vorkommen, dass sie gar nicht laden. Das betrifft vorwiegend Notebooks oder Tablets, die eine höhere Ladeleistung benötigen; bei Laptops sind es meist 90 oder 100 Watt. Die Leistung in Watt ergibt sich aus der Spannung (Volt; kurz: V) multipliziert mit der Stromstärke (Ampere; kurz: A).
Unser Tipp: Für Smartphones sollte man Geräte mit mindestens 18 Watt pro Port nehmen. Wer Notebooks laden möchte, sollte prüfen, wie viel Ladeleistung der Computer benötigt.
Anschlüsse: USB-C, Micro-USB oder USB-A?
Welcher USB-Anschluss am wichtigsten ist, hängt davon ab, welche Geräte man anschließen möchte. Mittlerweile nutzen die allermeisten Geräte einen USB-C-Anschluss, es gibt aber auch für USB-A-Einsatzzwecke – je nachdem, welche Kabel man hat. Gerade wenn man neben einem Android-Handy mit USB-C auch ein iPhone mit Lightning-Anschluss verwenden will.
Der Micro-USB-Anschluss spielt inzwischen eine untergeordnete Rolle; wenn er vorhanden ist, dient er vorwiegend nur zum Laden der Powerbank. USB-C ist hier die bessere Lösung, da der Standard mittlerweile auch von der EU vorgeschrieben ist. Er ist universell und selbst Laptops nutzen immer mehr diesen Port.
Schneller Laden mit Quick Charge oder USB-PD?
Neben den kleinen und günstigen Powerbanks gibt es inzwischen auch deutlich größere, die nicht nur viel Kapazität, sondern auch viel Leistung haben. Manche Modelle geben über 100 Watt aus und eignen sich damit auch für den Betrieb von Laptops. Denn diese benötigen häufig 90 Watt oder mehr, wie unser Lenovo Yoga Pro 7 2023. Aber auch für den Einsatz von mobilen Lötkolben benötigt man einiges an Leistung, eine Steckdose aber nicht zwingend. Hier kann ebenfalls eine Powerbank mit viel Leistung zum Einsatz kommen.
Höherwertige Powerbanks unterstützen neben den normalen Ladevorgängen oft Techniken wie Qualcomm Quick Charge und USB Power Delivery (USB-PD). Beide Techniken müssen von Powerbank und Verbraucher unterstützt werden. Wenn nicht, dann fällt die Powerbank auf den normalen Lademodus per USB zurück.
Quick Charge ist eine Technik von Qualcomm, die Akkus der Smartphones und Tablets mit passendem Chipsatz schneller wieder aufladen möchte. In kurzer Zeit gelangt möglichst viel Energie in den Smartphone-Akku. Sprich, wer sein Handy 10 bis 15 Minuten anschließt, sollte danach für ein paar Stunden Saft haben. Aktuell ist die Version Quick Charge 4.0, sie stammt von 2017. Version 5 ist angekündigt, die meisten Powerbanks verwenden aber ohnehin nur Version 3.0 von 2015. In unserem Test lud eine entsprechende Powerbank mit QC 3.0 den Akku eines Smartphones in 35 Minuten von 0 auf 80 Prozent. Quick Charge 2.0 benötigte damals 70 Minuten. Die einzelnen Versionen sind abwärtskompatibel.
USB Power Delivery (USB-PD) ist besonders spannend. Das Protokoll kann die Spannung zwischen 5 Volt und bis zu 20 Volt regeln, bei bis zu 5 Ampere kommt man so auf eine Ladeleistung von strammen 100 Watt. Damit kann man nicht nur Smartphones laden, sondern auch Notebooks. USB-PD ist außerdem stark genug, um Endgeräte zu betreiben und oft Teil von USB-C-Hubs (Bestenliste). Vorsicht ist dann aber bei der Auswahl des Ladekabels geboten. Dieses benötigt einen speziellen Chip, der Powerbank und Verbraucher miteinander kommunizieren lässt. Unser Tipp: Einfach ein Thunderbolt-3-Kabel oder besser nutzen, dort gehört USB-PD fest zur Spezifikation. Mehr dazu erklären wir im Artikel 10 Ladekabel mit USB-C bis 100 Watt im Test: Gute Kabel kosten unter 10 Euro.
Empfehlung: Wer ein Smartphone mit Quick Charge hat, sollte in jedem Fall auf die passende Funktion in der Powerbank achten. Das Feature hilft meist auch beim Laden der Powerbank, sodass der externe Akku zügig wieder voll ist. USB-PD ist dann hilfreich, wenn man neben Smartphones auch Laptops laden möchte – dank USB-C ist das ja inzwischen problemlos möglich. Natürlich sollte auch das Netzteil PD wieder aufladen können. Entsprechend flotte Ladegeräte zeigen wir in der Top 10: USB-C-Ladegeräte ab 65 Watt für Tablet & Laptop.
Testverfahren: So testen wir Powerbanks
Zur Ermittlung der nutzbaren Kapazität verwenden wir das Messgerät F-nirsi FNB58, das uns Banggood zur Verfügung gestellt hat, und hängen es zwischen Powerbank und unsere elektronische Last. An dieser können wir wiederum präzise die zu entnehmende Leistung einstellen und damit etwa den Überlastschutz testen.
Für die Ermittlung der Effizienz, also der tatsächlich nutzbaren Kapazität, laden wir die Powerbank zunächst vollständig, um sie danach einmal gänzlich zu entleeren. Das Messgerät trackt dabei, wie viel Wh wir herausbekommen haben. Weiterhin können wir die Betriebsdaten über das integrierte LCD auslesen. Weiterhin sieht man, auf welche Schnellladetechnik sich die Geräte geeinigt haben – und über den integrierten PD-Listener, welche Ladestufen (5 V, 9 V etc.) und ob PPS angeboten wird.
Seinen eigenen Energiebedarf stillt das Messgerät über das angeschlossene USB-C-Kabel. Eine Dokumentation gibt es nicht.
Wireless Charging: Nützliche Spielerei
Bei Powerbanks ist der allerdings eingeschränkt. Qi ist alles andere als effizient. Die meisten Powerbanks liefern zudem nicht mehr als 5 Watt, Funktionen wie Quick Charge gibt es kabellos, aber nicht herstellerübergreifend. Dafür ist das Feature mittlerweile selbst in günstigen mobilen Akkus enthalten. Das belegt unser Artikel Induktive Energieübertragung: Qi-Powerbanks ab 10 Euro im Vergleich.
Wir finden: Für Smartphones ist Qi in der Powerbank ein nettes Feature, wenn das Handy den Standard unterstützt. Wenn möglich, sollte man aber per Kabel laden – das ist effizienter und schneller.
Kompakte Powerbanks: Klein muss nicht schlecht sein
Die meisten gezeigten Powerbanks sind ziemlich groß. Das macht sie unpraktisch für Hosen- oder Handtaschen. Kleine, mobile Geräte müssen nicht schlecht sein, man macht aber häufig Abstriche bei der Kapazität, kann also weniger aufladen.
Wir raten: Eine kleine Powerbank, die man dabei hat, ist im Zweifel hilfreicher als ein großer externer Akku, der daheim liegt. Beim Kauf sollte man darauf achten, dass die Powerbank zwischen 3000 mAh und 5000 mAh liefert und idealerweise gleich mit USB-C kommt. Dann bekommt man bereits für unter 10 Euro kompakte Geräte, wie von Hama, Varta und Xlayer. Alle liegen zwischen 2000 und 5000 mAh und reichen aus, wenn das Handy unterwegs nicht die Grätsche machen soll.
Starthilfe: Auto starten per Powerbank
Winter, Kälte, leere Batterie – kein Problem, wenn man die passende Powerbank hat. Tatsächlich gibt es Modelle, die nicht nur das Handy laden, sondern auch als Starthilfe für das Auto dienen. Im Paket liegt nicht nur ein USB-Kabel, sondern auch spezielle Klammern für die Autobatterie.
Der einzige Haken: Es muss genügend Saft in der Powerbank sein (was sie über eine LED-Anzeige signalisiert). Liegt die Powerbank mit Starthilfe ungenutzt im Kofferraum oder unter dem Sitz, geht der Akku mit der Zeit leider kaputt. Entsprechend sollte man das Gerät idealerweise als Powerbank nutzen und regelmäßig laden.
Unser Tipp: Ganz ehrlich, warum nicht? Die Powerbanks mit Starthilfefunktion sind zwar groß, aber sie haben genügend Kapazität, um Smartphones mehrmals komplett zu laden. Die Kosten sind erträglich.
Notstrom: Powerbanks mit USV-Funktion
Auch die kleinen Powerbank-Akkus gibt es mit Notstromfunktion, die dank geringer Verzögerung schnell von Netzbetrieb auf Inselbetrieb umstellt. Bei Powerstations kannten wir dieses Feature schon länger, doch tatsächlich gibt es auch Powerbanks. Freilich kann man damit im Gegensatz zu den großen Akkus nicht den ganzen Hausstrom kurzzeitig übernehmen oder die Stromzufuhr am PC bei Stromausfall überbrücken. Doch kleinere Geräte, wie ein Router, lassen sich so für eine gewisse Zeit weiter betreiben.
Solarzellen für Powerbanks
Die Idee ist auf den ersten Blick genial: Einfach eine Solarzelle auf die Powerbank und man hat immer Strom. In der Praxis ist man dann aber enttäuscht. Die Solarzellen sind zu klein und nicht wirklich effizient. Gerade auch Solar-Powerbanks mit im Gehäuse integrierten Solarzellen sind reichlich sinnbefreit, hier lädt man kaum etwas nach.
Geräte dieser Art zeigt der Artikel Überall Strom mit Photovoltaik: Solar-Rucksäcke, Powerbanks & mehr. Nach knapp 50 Stunden in der Sonne (also fast einer Woche, abhängig vom Wetter) waren die Geräte zu 100 und zu 75 Prozent voll, wirklich praktikabel ist das aber nicht. Mit Solarzellen kann man das Grundrauschen abfangen und die Powerbanks zumindest etwas laden, aber wirklich voll bekommt man sie nur schwer.
Fazit
Jeder sollte eine Powerbank im Rucksack oder der Tasche dabeihaben. Die Akkus bei Smartphones werden zwar größer, der Stromhunger aber auch. Die nächste Akkurevolution ist gefühlt zwar „immer nur ein paar Jahre“ entfernt, bis dahin helfen Powerbanks, die Lücke bis zur nächsten Steckdose zu überbrücken.
Am besten abgeschnitten hat in unserem Test die Anker Zolo 20k, die nicht nur günstig, sondern auch richtig gut und effizient ist. Im Jahr 2025 waren einzelne Chargen zwar von einem Rückruf betroffen, jetzt ist sie aber wieder für 24 Euro erhältlich. Sie hat nicht die denkbar höchste Kapazität, die höchste Ausgangsleistung oder andere Superlative, war aber im Praxistest herausragend gut. Ein gutes Gesamtpaket zum fairen Preis gibt es auch bei der Ugreen Nexode 12.000 mAh. Zum Preis von 40 Euro liefert sie bereits starke 100 Watt.
Wichtige Features sind die Kapazität und die Leistung pro Port. Es hilft zudem, wenn der Ausgang der Powerbank das gleiche Format hat wie der Eingang am Smartphone – ein Adapter von USB-A auf USB-C bringt unnötige Verluste oder stoppt im Zweifel Features wie Quick Charge oder USB-PD.
Weitere relevante Artikel zu diesem Thema sind:
Künstliche Intelligenz
Erster Touchscreen-Mac: Apple plant kein „Touch-first“
Bereits im Herbst oder Winter soll es so weit sein: Apple will Insidern zufolge erstmals einen Touchscreen in einen Mac einbauen. Die Hardware-Umstellung soll aber keinen grundsätzlichen Strategiewechsel darstellen, behauptet der üblicherweise gut informierte Bloomberg-Reporter Mark Gurman: Eine Fusion von MacBook und iPad steht demnach nicht an, zu einer Hybrid-Maschine kommt es nicht. Der Grund ist einfach: Apple hat nicht vor, aus zwei lukrativen Produktlinien eine einzige zu machen.
Weiterlesen nach der Anzeige
Touch als „Bonus“
Der neue Touchscreen-Mac – vermutlich in Form eines umgestalteten MacBook Pro – soll daher „Touch-freundlich“, aber nicht „Touch-first“ sein. Die Idee ist, dass Nutzer vergleichsweise bequem zwischen Finger- und Tastatursteuerung wechseln können sollen. Weder an der vollwertigen Tastatur noch am Trackpad soll sich etwas ändern, stattdessen wird macOS so angepasst, dass es sich alternativ auch mit den Fingern bedienen lässt. Eine gewisse Vorarbeit gab es bereits durch Apples Liquid-Glass-Interface in macOS 26, mit macOS 27 sollen sich Menüs, Icons und andere Bedienelemente automatisch anpassen, je nachdem, wie der Nutzer arbeitet. Die Maschine soll sich nicht anfühlen wie ein iPad, so Gurman. Es sei das MacBook, das man seit zwei Jahrzehnten kennt – Touch diene als „Bonus“.
Die Hardware soll sich vom Formfaktor her auch nicht ändern. So wird man den Bildschirm nicht nach hinten klappen können, um den Mac im reinen Tabletbetrieb zu verwenden. Wie angenehm die Touch-Bedienung im Rahmen einer Notebook-Anordnung sein wird, muss sich zeigen – schon der 2011 verstorbene Apple-Mitbegründer Steve Jobs hatte vor Jahren bemängelt, dass einem dabei potenziell der Arm abfällt. Resultat war das iPad als eigene Produktkategorie.
Umsatzfragen und ein riesiges Foldable
Apple will dennoch seine Einnahmen durch Mac und iPad nicht kannibalisieren. Sowohl iPads als auch Mac tragen im Jahr rund 30 Milliarden US-Dollar zum Umsatz bei. Intern gibt es aber auch noch weitere Pläne. So soll Apple nach wie vor an einem klappbaren iPad mit (sehr) großem Bildschirm arbeiten. Das Gerät soll aber nicht vor 2029 auf den Markt kommen. Bis dahin könnte Apple seine Trennung zwischen Mac und iPad noch einmal überdenken.
Davor will Apple, ebenfalls laut Gurman, ein erstes MacBook Air mit OLED-Display auf den Markt bringen, vermutlich aber nicht vor 2028 und ohne Touchscreen.
Weiterlesen nach der Anzeige
(bsc)
Künstliche Intelligenz
iX-Workshop: Mit Kubernetes zur effizienten Container-Orchestrierung
Eine effiziente Container-Orchestrierung erleichtert und automatisiert das Management von containerisierten Anwendungen. Kubernetes hat sich hier als De-facto-Standard etabliert. Unser fünftägiger Praxis-Workshop führt Linux-Administratoren in die Nutzung von Kubernetes zur Container-Orchestrierung und zur Verwaltung von containerisierten Anwendungen ein.
Weiterlesen nach der Anzeige
Von den Grundlagen in die Praxis
In unserem fünftägigen Workshop Kubernetes administrieren: Installation, Konfiguration und Betrieb erhalten Sie eine umfassende Einführung in die Installation, Konfiguration und Wartung von Kubernetes im produktiven Umfeld. Sie lernen das Zusammenspiel der einzelnen Komponenten kennen und erarbeiten anhand von Praxisbeispielen verschiedene Anwendungsfälle für den Betrieb eigener Applikationen auf einer Kubernetes-Plattform.
Der Workshop ist interaktiv gestaltet, sodass Sie das Erlernte direkt in die Praxis umsetzen können. In zahlreichen Übungen beschäftigen Sie sich mit Schlüsselthemen wie der Installation und Konfiguration von Kubernetes-Komponenten, der Administration und Wartung von Clustern sowie der Nutzung von Kubernetes-Clustern. Darüber hinaus werden fortgeschrittene Themen wie Multi-Master-Setups, Ingress und Ingress Controller, Authentifizierung und Autorisierung sowie der Einsatz von Persistent Volumes behandelt.
Dieser Workshop richtet sich an Linux-Administratoren. Ihr Trainer Marko Oldenburg arbeitet als Linux Consultant und zertifizierter Trainer bei der B1 Systems GmbH. Dort unterstützt er Unternehmen dabei, die Effizienz und Zuverlässigkeit von Linux-Systemen und -Anwendungen zu verbessern.

(sfe)
Künstliche Intelligenz
C++ für eingebettete Systeme: constexpr und consteval
Im heutigen Beitrag zeige ich, wie modernes C++ den Code für eingebettete Systeme beeinflussen kann. Der Code nutzt Features bis zu C++23.
Weiterlesen nach der Anzeige

Andreas Fertig ist erfahrener C++-Trainer und Berater, der weltweit Präsenz- sowie Remote-Kurse anbietet. Er engagiert sich im C++-Standardisierungskomitee und spricht regelmäßig auf internationalen Konferenzen. Mit C++ Insights ( hat er ein international anerkanntes Tool entwickelt, das C++-Programmierenden hilft, C++ noch besser zu verstehen.
Das Beispiel, das ich unten zeige, dreht sich um mindestens zwei Fragen, die mir Kunden schon oft gestellt haben:
- Wozu ist
constevalgut? - Was ist dieser benutzerdefinierte Literal-Operator und warum sollte mich das interessieren?
Ich werde diese beiden Fragen beantworten, aber es nicht dabei belassen. Das unten stehende Beispiel aus der Praxis zeigt auch die neuesten Ergänzungen zu C++, die dazu beitragen, Code robuster und sicherer zu machen.
Was ist eine MAC-Adresse?
Ich gebe viele Kurse für Kunden, die eingebettete Systeme entwickeln. Ich habe lange in diesem Bereich gearbeitet und es hat mir sehr viel Spaß gemacht.
Ein immer wiederkehrendes Thema ist die Vernetzung. Obwohl es heutzutage verschiedene Netzwerktypen und -technologien gibt, wollen wir uns in diesem Beitrag mit dem Internetprotokoll (IP) beschäftigen. Die Basis der Netzwerkkommunikation ist die Netzwerkkarte (NIC). Jede NIC hat eine eindeutige Medium Control Address (MAC) zugewiesen bekommen. Die MAC-Adresse ist die Basis für alles, was darauf aufbaut, wie TCP/IP.
Weiterlesen nach der Anzeige
Eine MAC-Adresse besteht aus genau sechs Bytes. Eine Möglichkeit, eine MAC-Adresse in Code darzustellen, ist folgende:
struct MACAddr {
std::array data;
};
Die für Menschen lesbare Form der MAC-Adresse stellt diese sechs Bytes als Hexadezimalziffern dar, die zu zweit gruppiert und durch einen Doppelpunkt oder einen Bindestrich getrennt sind, wie hier:
12:34:56:78:90:AB
Einige dieser MAC-Adressen sind schon beim Kompilieren bekannt, andere können Nutzer während der Laufzeit eingeben.
Parsen einer MAC-Adresszeichenfolge.
Als ersten Schritt schauen wir uns an, wie eine Funktion, die eine MAC-Adresse in Zeichenfolgenform konvertiert, in eine 6-Byte-Version umgewandelt werden kann. Oben ist MACAddr als Basis. Aus Gründen der Speichersicherheit habe ich mit std::array angefangen. Ich ersetze alle C-Arrays durch die stärkere C++-Version, wo es geht. Der große Vorteil ist, dass ich jederzeit die Größe abfragen kann.
Für die Parsing-Funktion ist eine Zeichenfolge nur dann gültig, wenn sie mindestens 17 Zeichen enthält (6 Bytes mal 2 aufgrund des Hexadezimal-Formats plus 5 Trennzeichen). Das Auffinden der Trennzeichen ist ein weiterer Punkt.
In macFromString ist eine mögliche Implementierung:
constexpr std::expected // #A
macFromString(std::span addr) // #B
{
// #C
if(addr.size() < 17) { return std::unexpected(std::errc::message_size); }
MACAddr res{};
// #D
for(int i = 0; auto& val : res.data) {
// #E
// C++26 will have .at!
if((i < 5) and (addr[2] != ':')) {
return std::unexpected(std::errc::message_size);
}
auto isAllowedHexChar = [](char c) {
return ((('a' <= c) and ('f' >= c)) or // isalpha reduced
(('A' <= c) and ('F' >= c)) or // isalpha reduced
(('0' <= c) and ('9' >= c)) // is digit
);
};
// #F
if(not(isAllowedHexChar(addr[0]) and isAllowedHexChar(addr[1]))) {
return std::unexpected(std::errc::invalid_argument);
}
// #G
if(std::from_chars(addr.data(), addr.data() + 2, val, 16).ec !=
std::errc()) {
return std::unexpected(std::errc::message_size);
}
// #H
addr = addr.subspan((addr.size() >= 3) ? 3 : addr.size());
++i;
}
return res;
}
Ich fange mit dem Rückgabedatentyp std::expected (#A) an. Dieser Typ ist seit C++23 verfügbar. Wie du siehst, ist der erste Template-Parameter der Datentyp, den du im besten Fall erwarten darfst (daher der Name expected), und der zweite Parameter ist der Datentyp für die Fehlerbedingung. Einfachheitshalber habe ich hier std:errc verwendet. Du solltest immer einen Datentypen wählen, der auf die Anforderungen in deiner Codebasis zugeschnitten ist.
Die Stärke von std::expected liegt darin, dass es entweder einen Wert oder einen Fehlercode enthält. Es gibt zwar ungültige MAC-Adressen, aber nehmen wir mal den einfachen Weg und betrachten die Adresse als ungültig, wenn die Zeichenfolge zu kurz ist, die erforderlichen Trennzeichen nicht enthält oder ungültige Zeichen enthält (wie T, das keine Hexadezimalzahl ist). Der Einsatz von std::expected hilft dabei, das Out-Parameter-Muster zu entfernen, das ich ungern mag.
Als Nächstes siehst du, dass macFromString in #B einen std::span als Parameter verwendet. Das Schöne an std::span, der in C++20 hinzugefügt wurde, ist, dass es eine sehr kostengünstige Ansicht der Originaldaten ist, während std::span die Datengröße beibehält. All diese Punkte machen std::span zum perfekten Datentyp, um Array-ähnliche Daten zu übergeben und dabei trotzdem die Grenzen sicher einzuhalten.
Als Erstes prüfe ich in macFromString, ob die Zeichenfolge lang genug ist (#C). Dank std::span ist das nicht nur einfach, sondern auch sicher.
Was passiert, wenn die Zeichenfolge zu kurz ist? Das wäre unerwartet. Deshalb gebe ich in diesem Fall ein std::unexpected mit einem std:errc-Code zurück. Hier zeigt sich die Schönheit von std::expected: Der Fehlerfall wird absolut klar gekennzeichnet.
Schauen wir uns jetzt die Konvertierung an, für die eine Schleife nötig ist. Ich setze eine bereichsbasierte For-Schleife (#D) ein und verwende dafür C++20 mit einem Initialisierer meiner Zählvariablen i.
Ich überprüfe innerhalb der Schleife auf das Trennzeichen, das sich an Position zwei in std::span befindet, wenn wir den letzten Teil nicht betrachten. Das ist dasselbe Verfahren wie oben in #C: Wenn kein Trennzeichen vorhanden ist (oder ein anderes), gebe ich in #D std::unexpected zurück.
In #F wird überprüft, ob die beiden aktuell betrachteten Zeichen im Bereich eines gültigen Hexadezimal-Zeichens liegen. Leider ist std::isdigit nicht constexpr. Das Gleiche gilt für std::isalpha, aber das fehlende constexpr bei dieser Funktion ist nicht so wichtig, da hier ein reduzierter Bereich erforderlich ist.
Als Nächstes kommt in #G die eigentliche Konvertierung. Ich benutze std::from_chars aus C++17. Das Schöne daran ist, dass ich die Werte aus std::span direkt übergeben kann, obwohl sie nicht mit dem üblichen Hexadezimalzahl-Indikator 0x beginnen. Ich kann std::from_chars mitteilen, welche Basis die Zahl hat.
Sollte die Konvertierung fehlschlagen, überprüfe ich den Fehlercode ec[/code und gebe erneut ein [code]std::unexpected zurück. Für deinen Code ist es nützlich, verschiedene Fehlerwerte zu verwenden, um anzuzeigen, an welcher Stelle die Konvertierung fehlgeschlagen ist.
Der letzte Schritt in #H besteht dann darin, das std::span mithilfe seiner subspan-Funktionalität weiterzuschieben. Hier musst du vorsichtig sein: Wenn du den Bereich verlässt, ist das Verhalten undefiniert. Deshalb überprüfe ich, wie viele Elemente noch übrig sind, und gehe entweder um diese Anzahl weiter oder um die Anzahl, die noch übrig ist. Der letzte Teil gilt immer für das letzte Ziffernpaar, das ohne nachfolgendes Trennzeichen kommt.
Es ist wichtig, nicht zu vergessen, i als letzten Schritt zu erhöhen. Dann haben wir einen robusten und sicheren MAC-Adressen-Parser, der die neuesten C++-Funktionen nutzt.
Warum constexpr?
Ein kleines Detail, das ich bei der Erläuterung der Implementierung von macFromString noch nicht angesprochen habe, ist die erste Zeichenfolge in der Funktionsdeklaration, die das Schlüsselwort constexpr bildet.
Die Antwort ist einfach: Wir wollen macFromString zur Kompilierungszeit aufrufen können. Hier kommt der anfangs erwähnte Literal-Operator (UDL) zum Tragen.
Eine interessante Eigenschaft des UDL-Operators ist, dass er nur mit Konstanten zur Kompilierungszeit aufgerufen werden kann. Du kannst den UDL-Operator manuell und damit mit Laufzeitwerten aufrufen, aber das widerspricht völlig dem Zweck eines Operators.
Wir benötigen einen UDL _macaddr, der ein MACAddr-Objekt zurückgibt, damit der folgende Code gültig ist:
// #A
auto data{std::to_array("12:34:56:78:90:AB")};
auto m = macFromString(data);
auto compileTimeMAC = "12:34:56:78:90:AB"_macaddr;
Die Implementierung des UDL-Operators ist recht einfach:
consteval MACAddr operator""_macaddr(const char* str, size_t length)
{
return macFromString({str, length}).value();
}
Ich benutze die UDL-Operatorform, die ein const char* und ein std::size_t nimmt. Der Compiler erkennt freundlicherweise die Größe der Konstantenzeichenfolge zur Kompilierungszeit und teilt sie dem Operator mit. Damit sind alle Informationen zum Aufruf von macFromString vorhanden. Das Beste daran ist, dass die Zeichenfolge und die Länge immer zu 100 % übereinstimmen, da wir absolut nichts damit zu tun haben. Gib einfach die Daten weiter und bilde beim Aufruf von macFromString ein std::span.
Aber macFromString gibt ein std::expected zurück, mehr als nur ein MACAddr. Was tun? Ich rufe einfach .value für das Ergebnis von macFromString auf. Falls std::expected keinen Wert enthält, löst der Datentyp eine Exception aus. Aber ist das nicht schlecht? In anderen Fällen vielleicht schon, aber hier finde ich es mehr als okay, ich finde es großartig!
Hast du das erste Schlüsselwort bemerkt, das ich für den UDL-Operator verwendet habe? Es ist consteval! Ich erzwinge, dass diese Funktion nur zur Kompilierungszeit ausgewertet wird. Bei einer ungültigen MAC-Adresszeichenfolge führt die Ausnahme zum Abbruch des Kompilierungsvorgangs. So kannst du solche Fehler effektiv während der Entwicklung abfangen. Keine fest codierte MAC-Adresse sollte ungültig sein, oder?
consteval hat hier noch einen weiteren Vorteil: Wenn die Implementierung von macFromString nicht constexpr wäre, beispielsweise wegen eines Throw oder anderen undefinierten Verhaltens, würde die Auswertung des UDL zu einem Laufzeitaufruf werden. Das ist sicher nicht das, was du willst.
Robuster, sicherer und besser lesbar
Die gezeigten Elemente helfen dir, deinen Code robuster zu machen und die Sicherheit sowie die Lesbarkeit zu verbessern.
Die Anwendung der neuesten Funktionen von C++ ist in vielerlei Hinsicht vorteilhaft. Eine weitere Erkenntnis: Als Faustregel gilt, dass du jeden UDL-Operator in C++20 und höher als consteval definieren solltest.
(rme)
-
Künstliche Intelligenzvor 2 MonatenSchnelles Boot statt Bus und Bahn: Was sich von London und New York lernen lässt
-
Social Mediavor 3 WochenCommunity Management zwischen Reichweite und Verantwortung
-
Künstliche Intelligenzvor 2 Wochen
Top 10: Die beste kabellose Überwachungskamera im Test – Akku, WLAN, LTE & Solar
-
Social Mediavor 1 TagCommunity Management und Zielgruppen-Analyse: Die besten Insights aus Blog und Podcast
-
Datenschutz & Sicherheitvor 3 MonatenSyncthing‑Fork unter fremder Kontrolle? Community schluckt das nicht
-
Entwicklung & Codevor 3 MonatenKommentar: Anthropic verschenkt MCP – mit fragwürdigen Hintertüren
-
Künstliche Intelligenzvor 3 MonatenGame Over: JetBrains beendet Fleet und startet mit KI‑Plattform neu
-
Social Mediavor 3 MonatenDie meistgehörten Gastfolgen 2025 im Feed & Fudder Podcast – Social Media, Recruiting und Karriere-Insights
