S
S
sad8c2013-06-18 12:01:31
JavaScript
sad8c, 2013-06-18 12:01:31

Issues with Buffer() in nodejs

With buffer() , I form a 100-byte packet header.

According to the rules for forming a header, I must specify the following:

Offset  Length(bytes)   Type    Description
0       4               Int     Длина текста сообщения (без заголовка)
4       4               Int     Время создания запроса (кол-во секунд с 1 января 1970 GMT)
8       4               Int     Идентификатор сообщения
12      32                      Зарезервировано (заполнено нулевым байтом)
44      2               Int     Идентификатор клиента
46      1                       1-й байт флагов сообщения
47      1                       2-й байт флагов сообщения
48      4               Int     Идентификатор симметричного ключа
52      48                      Зарезервировано (заполнено нулевым байтом)

here is my code:

var query="Some query text with 166 bites length,";

    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;

here is the byte order that buf.inspect() gives out

<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>
, but this is not what is passed to the socket, but

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
what happened?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
M
Mithgol, 2013-06-18
@Mithgol

By default , buf.toString() works in UTF-8 encoding.
Try buf.toString('binary') - maybe you'll get what you want without fail.

S
sad8c, 2013-06-18
@sad8c

I just need utf8.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question