Wie man Bits effizient aus Bytes liest?

8

Ich arbeite an einem Projekt, das WebSockets enthält, und Daten zwischen dem Server (Node.js) und dem Client (Chrome) werden in einem benutzerdefinierten (sehr einfachen) Format für den Datenaustausch gesendet, den ich eingerichtet habe.

>

Ich sende Daten in Stücken von 3 Bits, weil ich Artikel sende, die alle 8 Möglichkeiten haben. Das Datenformat sieht folgendermaßen aus:

%Vor%

Zur Zeit analysiere ich die Elemente wie folgt aus den Bytes:

%Vor%

Persönlich fühlt sich das als zu anspruchsvoll an. Das Problem ist, dass es nur komplex ist, weil ich Daten in Bytes erhalte, die ein Vielfaches von 8 sind. Um Elemente von 3 Bits auszuwerten, muss ich etwas verschieben, UND-Operationen ausführen und weil 8 nicht durch 3 teilbar ist manchmal müssen sogar Teile von zwei Bytes wie für itemC kombiniert werden.

Es wäre viel effektiver, diese Daten als Gruppen von 3 Bits anstelle von Gruppen von 8 Bits zu lesen.

Was ich herausgefunden habe, ist das Konvertieren aller Bytes in Bits zu einer Zeichenkette mit .toString(2) , dann das Verwenden von .substring , um einen Teilstring mit der Länge 3 zu erhalten, und das Umwandeln in eine Zahl mit parseInt(bitString, 2) , aber ich Ich denke, das ist nicht der richtige Weg, da die String-Manipulation langsam ist und ich eigentlich gar nichts String-bezogenes mache.

Ist es möglich, Bits in Gruppen von z. 3 statt sie aus Bytes zu analysieren? Oder gibt es eine effizientere Möglichkeit, Bits aus Bytes zu lesen?

    
pimvdb 22.10.2011, 13:19
quelle

4 Antworten

6

Die binären AND- und Bit-Shifting-Operationen sind der schnellste Weg, dies zu tun. Sie übersetzen gut in Maschinencode-Anweisungen. Die einzige Möglichkeit, dies weiter zu beschleunigen, besteht darin, Bandbreite für die Geschwindigkeit zu opfern, indem zum Beispiel einfach nicht mehr als 3 Bits pro Byte verwendet werden, aber nach Ihrer Frage haben Sie diesen Kompromiss wahrscheinlich bereits in Erwägung gezogen und abgelehnt.

    
Marcel Offermans 22.10.2011, 13:27
quelle
4
%Vor%     
wasikuss 15.11.2011 08:41
quelle
0

Wenn endian-ness beachtet wird, können Sie darauf als int- oder long-int-Array zugreifen. Es gibt noch eine andere Möglichkeit, Bit 3 und Bit 7 nicht zu verwenden

    
alvin 22.10.2011 13:34
quelle
0

Wir können den Wert erhalten, den wir brauchen, indem wir eine passende 16-Bit-Ganzzahl erhalten und sie dann bitshift.

Es ist klar, dass wir, um i-th -Wert zu erhalten, 16-Bit-Integer mit Offset in Bytes erhalten sollten, die (bits * (i + 1) - 16)/8 <= offset <= (bits * i)/8 entsprechen.

Nehmen wir M=bits*i/8 , also haben wir M + bits/8 - 2<= offset <= M . Dann erhalten wir einen minimalen Offset als ceil(M + bits/8 - 2) und berechnen die Position des i-ten Werts in der 16-Bit-Ganzzahl durch Offsets. Ich habe gerade die folgende Funktion geschrieben

%Vor%

Und das folgende Beispiel, um 8 5-Bit-Werte aus dem Puffer mit 5 Bytes Länge zu lesen.

%Vor%

Wenn ich node test.js starte, habe ich

%Vor%     
shukshin.ivan 04.04.2014 11:02
quelle