【问题标题】:Converting ArrayBuffer to String then back to ArrayBuffer using TextDecoder/TextEncoder returning a different result使用 TextDecoder/TextEncoder 将 ArrayBuffer 转换为 String,然后返回 ArrayBuffer,返回不同的结果
【发布时间】:2018-10-16 07:18:15
【问题描述】:

我有一个 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

【问题讨论】:

  • 您是否尝试将任意字节数组编码为文本,然后将其转换回相同的字节序列...或者字节数组是否包含合法的 utf8 编码文本?如果是前者,你根本就做不到。
  • 我希望它是相同的字节序列。我的最终目标是替换 ArrayBuffer 中的值。因此,如果它包含字符串“1234”,我想将其设为“1111”并创建一个新的 ArrayBuffer,以便可以在内存中替换它。我这样做是为了进行粗略的测试,并注意到由于尺寸不匹配,它永远不会起作用。

标签: javascript arraybuffer


【解决方案1】:

TextDecoderTextEncoder 旨在与 text 一起使用。 要将任意字节序列转换为字符串并返回,最好将每个字节视为单个字符。

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 字符(例如“π” ) 将不再可识别,因为它们将导致与每个单独字节的代码相对应的字符的串联。

【讨论】:

  • 谢谢。由于 Frida 不允许使用“from”方法,因此我不得不稍微改变一下,但你可以通过循环来完成它,它会起作用。我正在尝试的内存替换按我的预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2016-10-12
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多