2013-06-18 170 views
0

与缓冲器()问题我形成分组报头,以100个字节用的NodeJS缓冲液()

根据形成标题的规则我必须指定以下内容:

Offset Length(bytes) Type Description 
0  4    Int  The length of the message (no header) 
4  4    Int  Time to create the query (the number of seconds since January 1, 1970 GMT) 
8  4    Int  The message ID 
12  32      Reserved (filled with null byte) 
44  2    Int  The client ID 
46  1      1st byte of message flags 
47  1      2nd byte of message flags 
48  4    Int  The identifier of the symmetric key 
52  48      Reserved (filled with null byte) 

这里是我的代码:

var query="<?xml version=\"1.0\" encoding=\"utf-8\"?><sirena><query><get_currency_rates><curr1>RUB</curr1><curr2>USD</curr2><owner>IATA</owner></get_currency_rates></query></sirena>"; 

     var buf=new Buffer(100); 
     var query1=new Buffer(query); 
     console.log(query1.length); 
     buf.writeInt32BE(query1.length, 0, true);//Длина текста сообщения (без заголовка) 

     var foo = new Date; 
     var unixtime_ms = foo.getTime(); 
     var unixtime = parseInt(unixtime_ms/1000); 
     console.log(unixtime); 
     buf.writeInt32BE(unixtime, 4, true);//Время создания запроса (кол-во секунд с 1 января 1970 GMT) 

     buf.writeInt32BE(1, 8, true);//id сообщения. потом нужно автоинкрементить 

     for(var i=12; i<44;i++){//Зарезервировано (заполнено нулевым байтом) 
      buf.writeInt8(0, i, true); 
     } 


     buf.writeInt16BE(5985, 44, true);//Идентификатор клиента 

     buf.writeInt8(0, 46, true);//1-й байт флагов сообщения - обязательно ли это?? 
     buf.writeInt8(0, 47, true);//2-й байт флагов сообщения - обязательно ли это?? 

     buf.writeInt32BE(0, 48, true);//Идентификатор симметричного ключа - обязательно ли это?? 


     for(var i=52; i<100;i++){//Зарезервировано (заполнено нулевым байтом) 
      buf.writeInt8(0, i, true); 
     } 

     var packet=buf.toString();//+query; 

这里是字节顺序,让buf.inspect()

<Buffer 00 00 00 a6 51 c0 15 db 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00> 

,但它传递到插座

0000 00ef bfbd 51ef bfbd 15ef bfbd 0000 
0001 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0000 0000 
0000 1761 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 

发生了什么?

回答

0

您正在使用不同的编码转换中的字符串< - >缓冲

//... 
console.log(buf); 
var packet=buf.toString('binary');//+query; 
console.log(Buffer(packet, 'binary')); 
//... 

- >

<Buffer 00 00 00 a6 51 c0 27 d6 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 61 00 00 00 00 00 ...> 
<Buffer 00 00 00 a6 51 c0 27 d6 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 61 00 00 00 00 00 ...> 

//... 
console.log(buf); 
var packet=buf.toString();//+query; // looks like utf8 here 
console.log(Buffer(packet, 'binary')); // and binary here (even without explicit 'binary') 
//... 

- >

<Buffer 00 00 00 a6 51 c0 27 d6 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 61 00 00 00 00 00 ...> 
<Buffer 00 00 00 fd 51 fd 28 28 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 61 00 00 00 00 00 ...> 
+0

我需要utf8编码。但是当我使用它时,我遇到了这些问题。 – user2496311

+1

按原样使用utf8和标头编码xml,即二进制。另外,为什么你需要将缓冲区转换为字符串呢? 'packet = new Buffer(100 + Buffer.byteLength(query,utf8); header.copy(packet); packet.write(query,100,'utf8');' –

+0

'header.copy(packet);'什么是它? – user2496311