2016-04-14 21 views
0

Bir soketten ikili komutları okuyan bir sunucu programım var. Sokete gönderilen tampon, verilerinin çok özel olarak sipariş edilmesini gerektirir. Bu, sağlanan bir örnek istemci uygulamasından gönderilen ve gönderilmesi gereken verilerin sırasını ve boyutunu gösteren bazı C kodudur.Düğüm: 16bit ikili bilgi gönderme

typedef unsigned char  u8; 
typedef unsigned short u16; 
typedef unsigned int  u32; 

typedef struct JobNodeInfo_s { 
    u16 jNodeInfoType;       /* per END device, per router, whole system */ 
    u8 value[32];  /* mac address/barcode value/Location */ 
} JobNodeInfo_t; 

typedef struct JobHdrFormat_s { 
    u16     jPreamble; 
    JobCommandType_t jCmd; 
    u16     jBatchID;  /* for logging */ 
    u16     jSeq; 
    u16     priority; 
    u16     option;   /* option field could be reserved for future extension */ 
    JobNodeInfo_t  jNodeInfo; 
    u16     jLen; 

} JobHdrFormat_t; 

JobHdrFormat_s yapı soketine bir boşluk işaretçi olarak geçirilir:

send(connfd, (void*)jFormat, sizeof(JobHdrFormat_t) + jFormat->jLen , 0); 

Şimdi, Node.js. bu tampon çoğaltmak için gereken Node Buffer sınıfına baktım ama sadece Octets'i desteklediğini fark ettim. Gördüğünüz gibi, bellek yuvalarının çoğu 16 bit tam sayı için ayrılmıştır. Verilerin Node.js'nin bu C kodu gibi ihtiyacım olan şekilde ayarlanması mümkün mü? Burada ona bir ilk atış almış:

var net = require('net'); 
var client = new net.Socket(); 
client.connect(13929, '192.168.2.2', function() { 
    var mac_addr = "041511000960", 
     outgoing_str = "FE9C00020000001100000004" 
      + mac_addr 
      + "0000", 
     outgoing_buf = new Buffer(outgoing_str.length, "hex"); 
var new_buff_arr = []; 
for (var i = 0, il = outgoing_str.length; i < il; i += 2) { 
    var cmd_substr = "0x" + outgoing_str.substring(i, i + 2), 
     i_cmd_substr = parseInt(cmd_substr); 
     console.log("substr: " + cmd_substr + " int: " + i_cmd_substr); 
     new_buff_arr.push(i_cmd_substr); 
} 
const buf = new Buffer(new_buff_arr); 
    client.write(buf , 
     function() { 
      console.log("data is written"); 
     } 
    ); 
}); 

client.on('data', function(data) { 
    console.log('Received: ' + data.toString("hex")); 
}); 

client.on('close', function() { 
    console.log('Connection closed'); 
}); 

ben üzerinden, döngü bir dize olarak tampon yazmaya teşebbüs ettik Aşağı yukarı, daha sonra her iki 'byte' gibi tek altıgen değerlerini yazmak ve Bunları sayılara geri dönüştürün ve arabelleği dışarı yazın. Düğüm sadece Octets ile çalışabilirse bu mümkün mü? Daha fazla bilgiye ihtiyacın olursa haberim olsun.

cevap

0
this de

Görünüş:

[gerçekleşen] jBinary JavaScript ile ikili verilerle çalışmak için kütüphane, herhangi bir kaynaktan yükleme verilerini verir [a edilir] Geçerli tarayıcı veya node.js üzerinde otomatik olarak en iyi desteklenen algılandığı şekilde

ve sonra da jBinary library Typesets bakmak ...

Ben jBinary ve Node.js. ile hiçbir deneyime sahip Ama ben böyle özellikleri ile ilgileniyorum ve şu anda bu çözümü buldum.