现在我们拿到了这段数据,但我们的字符串 "AB"
呢?
在与字节序列互盯之前,有必要让它变得好看点。将其格式化为每行 8 个 u8,用合适的空格分隔,继续使用十六进制表示。
FF FF FF FF F3 02 00 00
A 00 B 00 00 00 00 03
00 00 00 00 00 00 00 00
由于 A 和 B 两个字母都在 ASCII 范围内,因此我们能够直接从这段字节序列的数据里看到我们想要的字符串,现在的问题只剩下一个了:如何取出?或者用另一个问法:如何确定字符串的头尾?
到了这一步,已经能够确定
MoonBit
在
WebAssembly
导出的字符串并不是 C 式字符串了。如果用 \0
标记字符串的结尾,那么我们还没有得到 A 或 B,就已经在第 7 个 byte 处停止了;更别说这 7 个 byte 都不是我们想要的了。
那么它是如何编码的呢?我们再编译几个不同的字符串看看:
"A"
FF FF FF FF F3 01 00 00
A 00 00 01 00 00 00 00
"AA"
FF FF FF FF F3 02 00 00
A 00 A 00 00 00 00 03
00 00 00 00 00 00 00 00
"ABC"
FF FF FF FF F3 02 00 00
A 00 B 00 C 00 00 01
00 00 00 00 00 00 00 00
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
FF FF FF FF F3 0E 00 00
A 00 B 00 C 00 D 00
E 00 F 00 G 00 H 00
I 00 J 00 K 00 L 00
M 00 N 00 O 00 P 00
Q 00 R 00 S 00 T 00
U 00 V 00 W 00 X 00
Y 00 Z 00 00 00 00 03
00 00 00 00 00 00 00 00
可以发现,这些字节序列都有相似的模式,很容易从中识别出 header:前 8 个 byte
FF FF FF FF F3 XX 00 00
;标记为
XX
的 byte 看起来像是字符串的长度,但如果多对比几个结果,似乎又不总是长度。这很奇怪。
我们识别出了 header,也就是说我们知道字符串从哪里开始了(offset + 8),但我们还不知道字符串到哪里结束,这个不稳定的长度 byte 似乎让我们陷入了困境。