Преобразование ArrayBuffer в String, а затем обратно в ArrayBuffer с использованием TextDecoder / TextEncoder, возвращая другой результат - PullRequest
0 голосов
/ 06 мая 2018

У меня есть ArrayBuffer, который возвращается чтением памяти с использованием Frida. Я конвертирую ArrayBuffer в строку, а затем обратно в ArrayBuffer, используя TextDecoder и TextEncoder, однако результат в процессе изменяется. Длина ArrayBuffer после декодирования и перекодирования всегда получается больше. Существует ли расшифровка символов в расширенной форме?

Как я могу декодировать ArrayBuffer в String, а затем обратно в ArrayBuffer без потери целостности?

Пример кода:

var arrayBuff = Memory.readByteArray(pointer,2000); //Get a 2,000 byte ArrayBuffer

console.log(arrayBuff.byteLength); //Always returns 2,000

var textDecoder = new TextDecoder("utf-8");
var textEncoder = new TextEncoder("utf-8");

//Decode and encode same data without making any changes
var decoded = textDecoder.decode(arrayBuff);
var encoded = textEncoder.encode(decoded);

console.log(encoded.byteLength); //Fluctuates between but always greater than 2,000

1 Ответ

0 голосов
/ 06 мая 2018

TextDecoder и TextEncoder предназначены для работы с текстом . Чтобы преобразовать произвольную последовательность байтов в строку и обратно, лучше обрабатывать каждый байт как один символ.

var arrayBuff = Memory.readByteArray(pointer,2000); //Get a 2,000 byte ArrayBuffer

console.log(arrayBuff.byteLength); //Always returns 2,000

//Decode and encode same data without making any changes
var decoded = String.fromCharCode(...new Uint8Array(arrayBuff));
var encoded = Uint8Array.from([...decoded].map(ch => ch.charCodeAt())).buffer;

console.log(encoded.byteLength);

Строка decoded будет иметь точно такую ​​же длину, что и входной буфер, и ее можно легко манипулировать с помощью регулярных выражений, строковых методов и т. Д. Но следует помнить, что символы Юникода, которые занимают два или более байтов в памяти (например, «π») ) больше не будет распознаваться, так как они приведут к объединению символов, соответствующих коду каждого отдельного байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...