2

在 Rebol 2 中,可以to char!用来产生有效的单字节,您可以在二进制操作中使用,例如 append:

>> buffer: #{DECAFBAD}
>> data: #{FFAE}
>> append buffer (to char! (first data))
== #{DECAFBADFF}

似乎很明智。但是在 Rebol 3 中,你会得到一些不同的东西:

>> append buffer (to char! (first data))
== #{DECAFBADC3BF}

那是因为它没有将单个字符建模为单个字节(由于 Unicode)。所以 (255) 的整数值first data被翻译成一个两字节的序列:

>> to char! 255
== #"ÿ"
>> to binary! (to char! 255)
== #{C3BF}

鉴于 CHAR!不再等同于 Rebol 3 中的一个字节,也没有 BYTE!添加了数据类型(使得 BINARY! 可以被视为一系列这些 BYTE!就像 STRING!是一系列 CHAR!),对于这种情况该怎么办?

4

3 回答 3

2

使用 an integer!,这是我们目前在 R3 中表达一个字节的最接近的匹配项。

请注意,在 a 的上下文中将整数用作字节时会进行范围检查binary!

>> append #{} 1024
** Script error: value out of range: 1024
** Where: append
** Near: append #{} 1024

对于您的第一个示例,您实际上将一个系列的一个元素附加到另一个相同类型的系列。在 R3 中,您可以用最明显和最直接的方式表达这一点:

>> append #{DECAFBAD} first #{FFAE}
== #{DECAFBADFF}

因此,就此而言,abinary!是一系列范围受限integer!的 s。

不幸的是,这在 R2 中不起作用,因为它是二进制的!模型只是在许多微小的方面被打破,包括上述。虽然在概念上是二进制!在 R2 中可以被认为是一系列 char!s,这个概念并没有得到一致的实现。

于 2013-01-18T19:15:07.533 回答
1
>> buffer: #{DECAFBAD}
== #{DECAFBAD}

>> data: #{FFAE}
== #{FFAE}

>> append buffer data/1
== #{DECAFBADFF}
于 2013-01-19T01:56:52.563 回答
0

对于 Rebol 2 和 Rebol 3 中的问题,最简单的解决方法是使用 COPY/PART。这样,您无需尝试将内容减少为字节值,而是将其保留为二进制系列类型。您只是附加一个长度为 1 的二进制序列:

>> append buffer (copy/part data 1)
== #{DECAFBADFF}

看起来,为了完整起见,Rebol 3 会有一个 BYTE!类型,称之为“整数系列!” 显然不符合STRING的先例!

它是开源的,所以你(嗯,我?)可能会尝试添加它并查看完整的后果。:-)

于 2013-01-18T19:13:17.630 回答