Ich nehme an, Ihre Quelldaten sind ein uint8_t*
, da es nicht anders angegeben ist. Deshalb:
uint8_t *src = /* your source */;
Sie wollen ein uint16_t
zu einem bestimmten Offset zu extrahieren; Das bedeutet:
uint8_t high = src[offset], low = src[offset + 1];
uint16_t v = high << 8 | low;
/* offset and offset+1 must be in a valid range */
Oder kompakte:
uint16_t v = (src[offset] << 8) | src[offset+1];
Dann v
zu Little-Endian entsprechend konvertieren, aber bemerken Ebene bswap
nicht genug. Dies liegt daran, __builtin_bswapX
(wobei X ist die Anzahl der Bytes) einfach tauscht Bytes, die ist nicht entspricht htonX
/ntohX
: diese auch überprüfen Sie Ihre Maschine Endianness und, falls erforderlich, weitermachen und tauschen; Sonst sind sie ein No-Op. In der Tat, wenn Sie auf einer BE-Architektur sind, muss die htonX
ein No-Op sein (Daten ist bereits BE) und umgekehrt.
'atoi' und' atoll' wandelt eine String-Darstellung der Zahl in ein 'int' bzw.' long long' um. Ist Ihre 2-Byte-Ganzzahl als String-Repräsentation oder als 'uint16_t' in einem Byte-Array dargestellt? – GWW
Bitte klären Sie Ihre Frage mit einem Minimum an Code. – Cyb3rFly3r
Sorry, siehe Bearbeiten. – mezamorphic