@sad8c

Проблемы с Buffer() в nodejs

С помошью buffer() я формирую заголовок пакета в 100 байт

По правилам формирования заголовка я должен указать следующее:

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                      Зарезервировано (заполнено нулевым байтом)

вот мой код:

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;

вот порядок байт, что выдаёт 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
что случилось?
  • Вопрос задан
  • 4355 просмотров
Пригласить эксперта
Ответы на вопрос 2
Mithgol
@Mithgol
По умолчанию buf.toString() работает в кодировке UTF-8.

Попробуйте buf.toString('binary') — быть может, тем невозбранно достигнете желаемого.
Ответ написан
@sad8c Автор вопроса
Мне как раз и требуется utf8.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы