Ich verwende Buffer
auf meinem Node-Server und Buffer
auf meinem JavaScript-Client.Wie konvertiert man ein Javascript Objekt in einen Node Buffer?
Zum Zwecke der Speicherung von Bytes, ich bin auf der Suche nach senden meine Daten an den Server über WebSockets als binäre im Gegensatz zu JSON.
Also, wenn ich das Javascript-Objekt von [ 5, false, 55, "asdf" ]
hätte, möchte ich das in den Puffer auf dem Client direkt vor dem Senden konvertieren. Vielleicht so etwas wie:
object.toBuffer('int16', 'bool', 'int16', 'utf8');
und es auf dem Server so etwas wie diese lesen:
var obj = buffer.read('int16', 'bool', 'int16', 'utf8');
ich zu aktuellen Lösungen bin auf der Suche, und es sieht aus wie ich haben kann, nur eine Menge concat
tun ing, Angabe von Byte-Offsets/Längen, Konvertierung von Ints nach Boolean etc.
Gibt es einen besseren Weg?
Bearbeiten: Hier ist, wie ich denke, Sie müssen es derzeit tun. Ich denke, mein Problem ist nur, dass es zu ausführlich und fehleranfällig ist, und ich suche nach einer präziseren und eleganteren Vorgehensweise, da diese Operation an vielen verschiedenen Stellen in meinem Code ausgeführt wird.
// On client for [ 5, false, 55, "test" ]
const writeFirst = Buffer.allocUnsafe(2);
writeFirst.writeInt16LE(5, 0);
const writeSecond = Buffer.allocUnsafe(1);
writeSecond.writeUInt8(0);
const writeThird = Buffer.allocUnsafe(2);
writeThird.writeInt16LE(55, 0);
const writeFourth = Buffer.from('test');
const result = Buffer.concat([writeFirst, writeSecond, writeThird, writeFourth]);
// On server for reading buffer of [ 5, false, 55, "test" ]
const readFirst = result.readInt16LE(0);
const readSecond = Boolean(result.readUInt8(2));
const readThird = result.readInt16LE(3);
const readFourth = result.toString('utf8', 5);
Edit # 2: War googeln um, und ich denke, dass ich so etwas wie Protokollpuffer wollen könnte. Ich bin nicht genau sicher, was sie noch sind oder ob sie zutreffen, aber es sieht so aus, als könnten Sie für alle Ihre Nachrichten ein Schema in einer Datei angeben und dann Ihre JSON-Objekte zu diesem Schema serialisieren und einen Puffer zurückgeben, den Sie dann können Deserialisierung mit dem gleichen Schema auf dem Client/anderen Server. Ich schaue mir das genauer an.
Sie den Puffer auf einen Blob umwandeln müsste() auf einem Sockel zu senden sowieso und gzip sollte auf JSON-Wiederholung achten, welche Arrays sowieso wenig haben. – dandavis
@dandavis: Warum sollte es ein Blob sein? Kannst du 'connection.binaryType =" arraybuffer ";'? –
hmm vielleicht, ich wusste nicht, das war eine Socket-Option, das letzte Mal, als ich schmutzig wurde, nur Blobs arbeiteten in meinem Projekt ... – dandavis