javascript - 使用返回不同结果的 TextDecoder/TextEncoder 将 ArrayBuffer 转换为 String 然后返回 ArrayBuffer

标签 javascript arraybuffer

我有一个 ArrayBuffer,它是通过使用 Frida 读取内存返回的。我正在将 ArrayBuffer 转换为字符串,然后使用 TextDecoder 和 TextEncoder 转换回 ArrayBuffer,但结果在此过程中被更改。解码和重新编码后的 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

最佳答案

TextDecoderTextEncoder 设计用于处理文本。 要将任意字节序列转换为字符串并返回,最好将每个字节视为单个字符。

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 字符串的长度与输入缓冲区的长度完全相同,可以很容易地使用正则表达式、字符串方法等进行操作。但要注意在内存中占用两个或更多字节的 Unicode 字符(例如“π”)将不再可识别,因为它们将导致与每个单独字节的代码相对应的字符串联。

关于javascript - 使用返回不同结果的 TextDecoder/TextEncoder 将 ArrayBuffer 转换为 String 然后返回 ArrayBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198017/

相关文章:

javascript - Angular 1.5 将带有参数的函数传递给组件?

javascript - 如何在 Javascript 中将所有图像缩放到特定高度?

xmlhttprequest - ArrayBuffer 与 Blob 和 XHR2

javascript - 使用 Web Audio API 将多个 ArrayBuffer 合并/分层为一个 AudioBuffer

javascript - 如何从div中删除类属性?

javascript - Angularjs ng-disabled 无法正常工作

javascript - 在字符串和 ArrayBuffers 之间转换

javascript - 如何在 JavaScript 中将十六进制数据字符串转换为 ArrayBuffer

c++ - 如何从 C++ Node.js 插件读取/写入数据到 ArrayBuffer?

javascript - 为什么选择具有值(value)的输入会触发 Chrome 中的两个事件?