🐰 MoonBit 字符串的 山 WebAssembly 漂流 › 从哪里开始,到哪里结束? [#256]

现在我们拿到了这段数据,但我们的字符串 "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 似乎让我们陷入了困境。