2016-07-08 32 views
7

Düğüm sunucumda Buffer ve Javacript istemcimdeki Buffer kullanıyorum.Javascript Nesnesini Düğüm Arabelleğe dönüştürme nasıl?

Baytları kaydetme amacıyla, verilerimi sunucuya JSON'un aksine ikili dosyalar aracılığıyla sunucuya göndermek istiyorum.

Yani, eğer [ 5, false, 55, "asdf" ] Javascript nesnesine sahip olsaydım, bunu göndermeden önce istemcideki arabelleğe dönüştürmek isterim. Böyle Belki bir şey:

object.toBuffer('int16', 'bool', 'int16', 'utf8'); 

ve bu gibi sunucu şey üzerinde okuyun:

var obj = buffer.read('int16', 'bool', 'int16', 'utf8'); 

Ben şimdiki çözümlere bakıyorum ve concat bir sürü yapmak sadece ben olabilir gibi görünüyor ing, bayt ofsetleri/uzunlukları belirterek, ints'ten booleanlara dönüştürülme, vs. belirtme.

Daha iyi bir yol var mı?

Düzeltme: Şu anda bunu yapmak zorunda olduğunuzu düşünüyorum. Sanırım meselem çok fazla verimsiz ve hataya eğilimli ve bunu yapmak için daha özlü ve zarif bir yol arıyorum çünkü bu işlem kodumdaki birçok farklı yerde gerçekleştirilecek.

// 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); 

Düzenleme # 2: etrafında googling oldu ve ben protokol tamponları gibi bir şey isteyebilirsiniz düşünüyorum. Tam olarak ne olduklarından tam olarak emin değilim ya da uygularlarsa, tüm iletileriniz için bir dosyada şema belirtebiliyor ve JSON nesnelerini bu şemaya serileştirebiliyorsunuz ve bir arabelleğe dönebiliyorsunuz. İstemci/diğer sunucuda aynı şemayı kullanarak seri hale getirme. Buna biraz daha bakacağım. String, tampon, ArrayBuffer, Dizi veya dizi benzeri bir nesne:

+0

) bunu bir açık Soket zaten ve gzip, JSON tekrarı ile ilgilenmeli, ki bu diziler zaten çok az. – dandavis

+0

@dandavis: Neden bir blob olmalı? 'Connection.binaryType = "arraybuffer"; 'yapamazsınız? –

+0

hmm belki bir Soket seçeneğinin olduğunu bilmiyordum, son kez kirlendim, sadece Projemde Bloblar çalışıyordu ... – dandavis

cevap

7

bir tamponunun ilk argüman olmalıdır.

Bu bilgileri hesaba katarak, Dize Dizesinden bir arabellek oluşturarak aradığınız şeyi uygulayabiliriz. şöyle geriye Sonra JSON getirebilir

let json = [ 5, false, 55, 'asdf' ]; 

let buffer = Buffer.from(JSON.stringify(json)); 
console.log('Buffer: ', buffer); // Buffer: <Buffer 5b 20 35 2c 20 66 61 6c 73 65 2c 20 35 35 2c 20 22 61 73 64 66 22 20 5d> 

: Aşağıdaki gibi bir şey olur sen (göndermek için bir Blob Tampon dönüştürmek zorunda kalacak

let converted = JSON.parse(buffer); 
console.log('Parsed to json', converted); // Parsed to json [ 5, false, 55, 'asdf' ] 
+2

'new Buffer()' şu anda kullanımdan kaldırılmıştır (hala 8.2 düğümde çalışıyor olsa bile). Desteklenen yöntem 'Buffer.from ()' dır – Danibix