TypeScript декодирует буфер в объект JSON с помощью NodeJS / memoryjs

#node.js #json #typescript #buffer

#node.js #json #typescript #буфер

Вопрос:

Я пытаюсь получить объект json из буфера с mermoryjs.readBuffer() помощью, и я уже некоторое время занимаюсь этим, я не уверен, что еще делать. Вот что я пробовал:

 import { readBuffer } from 'memoryjs';

let buffer: Buffer = readBuffer(process, address, bufferLength);
console.log(buffer);

// (correctly) OUTPUTS -> <Buffer 88 77 b3 10 00 00 00 00 00 00 00 00 60 d5 69 1b 06 00 00 00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 c2 52 16 01 00 00 00 00 9a 8f 07 00 00 ... 6 more bytes>
 
 console.log(buffer.toJson());

// OUTPUS: 
{
  type: 'Buffer',
  data: [
    136, 119, 179, 16, 0, 0, 0, 0,  0,   0,   0, 0,
     96, 213, 105, 27, 6, 0, 0, 0, 22,   0,   0, 0,
      0,   0,   0,  0, 0, 0, 0, 0,  0,   0,   0, 0,
     64, 194,  82, 22, 1, 0, 0, 0,  0, 154, 143, 7,
      0,   0,   0,  0, 0, 0, 0, 0
  ]
}
 
 console.log(JSON.parse(JSON.stringify(buffer)));

// OUTPUS: 
{
  type: 'Buffer',
  data: [
    136, 119, 179, 16, 0, 0, 0, 0,  0,   0,   0, 0,
     96, 213, 105, 27, 6, 0, 0, 0, 22,   0,   0, 0,
      0,   0,   0,  0, 0, 0, 0, 0,  0,   0,   0, 0,
     64, 194,  82, 22, 1, 0, 0, 0,  0, 154, 143, 7,
      0,   0,   0,  0, 0, 0, 0, 0
  ]
}
 
 console.log(buffer.toString());

// OUTPUTS: �w�►`�i♠▬�R▬☺��
 

И впоследствии, когда он попробует это:

 console.log(JSON.parse(buffer.toString()));

// OUTPUTS: 
    SyntaxError: Unexpected token � in JSON at position 0
         at JSON.parse (<anonymous>)
 

Использование функции read() от structron (пакет npm https://www.npmjs.com/package/structron )

 import Struct = require('structron'); // doing " import Struct from 'structron' " gives an import error

let struct = new Struct();
console.log(this.struct.read(buffer, address));

// OUPUTS: {}
 

Я считываю память приложения в режиме реального времени, и когда я устанавливаю флажок в приложении, я вижу buffer , что в переменной есть 00 изменения 01 и внутренности, поэтому я не думаю, что проблема связана с неправильным получением данных буфера (с неправильным address или process ).

Я думаю, может быть, я смогу декодировать / десериализовать массив int из buffer.data в объект json, но я не уверен, есть ли способ это сделать.

Любой ввод мне очень поможет. Заранее спасибо.

Ответ №1:

Вероятно, лучший способ сериализовать буфер в виде открытого текста — преобразовать его в base64:

 const buf = Buffer.from("asdf");
// this is a string you can store in a JSON object somewhere
const serialized = x.toString("base64");
console.log(serialized); // YXNkZg==
// you can get the serialized base64 from a JSON object
const deserialized = Buffer.from(serialized, "base64");
console.log(deserialized); // <Buffer 61 73 64 66>
console.log(deserialized.toString("utf8")); // asdf
 

Обратите внимание, что если вы можете, вам следует записать буфер непосредственно в файл, поскольку base64 занимает больше места, чем необработанные двоичные данные.