1

考虑以下:

>> bin: to-binary {Rebol}
== #{5265626F6C}

>> parse/all bin [s: to end]
== true

我希望s已经捕获了二进制系列的头部,并且是 BINARY 类型!在 Rebol 3 中是这样的:

>> type? s
== binary!

>> s == bin
== true

在 Rebol 2 中,似乎 parse 必须将数据转换为字符串(或者至少将二进制“成像”为字符串!在后台,而不是比较相等)

>> type? s
== string!

>> s == bin
== false

因为 Rebol 2 不是 Unicode,所以二进制字节串和字符串基本上是等价的。但是使用 Rebol 3 的 Unicode,我猜如果你写的话,你最终会得到非常不同的行为:

parse/all to-string bin [s: to end]

因为它会开始将多个字节序列解释为字符串编码,如果您真正想要的是未解释的字节,这将不起作用。:-(

如果有人想编写在 Rebol 2 或 Rebol 3 中同样适用于解析 BINARY! 的代码,你将如何解决这个问题? (当然,理想情况下,让 Rebol 2 的行为更像 3。)

4

2 回答 2

2

事实上,Rebol 2 实际上只是将数据“成像”为字符串!而不是复制它,请注意以下几点

>> bin: to-binary {Rebol}
== #{5265626F6C}

>> parse bin [s: (clear s)] 
== true

>> s
== ""

>> bin
== #{}

这是因为 Rebol 2 有可用于将字符串数据别名为二进制的例程,反之亦然:AS-BINARYAS-STRING。与它们的 TO-BINARY 和 TO-STRING 变体不同,它们实际上并不复制数据。

这是一个想法,你(嗯,嗯,我)可以尝试......制作一个兼容性函数(我们称之为bin-pos):

bin-pos: func [pos [binary! string!]] [
    return either string? pos [
        ;; we must be using r2, image the parse position back to binary
        as-binary pos
    ] [
        ;; just a no-op in r3, binary parse input yields binary parse positions
        pos
    ]
]

所以在上面的例子中,对于 Rebol 2,正确的事情发生了,如果你在任何地方使用s你来代替bin-pos s

>> type? (bin-pos s)
== binary!

>> (bin-pos s) == bin
== true

对于使用 COPY 方言词并创建新字符串的情况,相同的技术将起作用……但也许应该使用不同的包装器名称。 bin-capture?

于 2013-01-07T20:21:06.843 回答
0

您可以在规则中添加一个解析操作,以确保捕获的数据是binary!

>> bin: to binary! {Rebol}

>> parse/all bin [s: to end (s: to binary! s)]

>> type? s
== binary!

您可以将此转换包装在ensure-binary帮助程序中以用于文档目的。

(请注意,如果我正确理解您答案的最后一段,这基本上就是您在那里的建议。但是,我认为即使是在没有 . 的情况下进行的捕获,您也可以使用这种方法copy。)

于 2013-01-07T21:44:32.520 回答