Kann ich ein Byte-Array nehmen und es in eine Struktur deserialisieren?

8

Ich lese eine Reihe von Bytes von einem Sockel und ich muss jedes Segment von n Bytes als ein Element in einer Struktur setzen.

%Vor%

Ich bekomme Fehler, die sagen, dass foobar 32 Bits ist, wenn array 24 Bits ist. Sollte nicht foobar 24 Bit (8 + 16 = 24) sein?

    
Fluffy 17.03.2016, 13:11
quelle

2 Antworten

13

Das Problem hierbei ist, dass das Feld y 16-Bit-ausgerichtet ist. Dein Speicherlayout ist also tatsächlich

%Vor%

Beachten Sie, dass das Tauschen der Reihenfolge von x und y nicht hilft, weil das Speicherlayout von Rust für Strukturen tatsächlich undefiniert ist (und somit immer noch 32 Bits, aber ohne Einfachheit, im Compiler). Wenn Sie davon abhängen, erhalten Sie undefiniertes Verhalten.

Die Gründe für die Ausrichtung werden in Zweck der Speicherausrichtung erläutert.

Sie können die Ausrichtung verhindern, indem Sie das Attribut repr(packed) zu Ihrer Struktur hinzufügen, aber Sie verlieren Leistung und die Fähigkeit, Referenzen auf Felder zu nehmen:

%Vor%

Der beste Weg wäre, transmute überhaupt nicht zu verwenden, sondern die Werte manuell zu extrahieren und zu hoffen, dass der Optimierer es schnell macht:

%Vor%

Eine Kiste wie die Byteorder kann den Leseprozess verschiedener Größen und Endianess aus den Bytes vereinfachen.

    
oli_obk - ker 17.03.2016, 13:21
quelle
0
%Vor%     
dpc.pw 14.08.2016 04:58
quelle

Tags und Links