我如何使用单个字节和二进制文件! Rebol 3中的字节数组?

时间:2013-01-18 18:40:15

标签: unicode utf-8 bytearray rebol rebol3

在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)。因此first data(255)的整数值被转换为双字节序列:

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

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

3 个答案:

答案 0 :(得分:2)

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

请注意,在binary!

的上下文中用作字节时,整数会进行范围检查
>> append #{} 1024
** Script error: value out of range: 1024
** Where: append
** Near: append #{} 1024

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

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

因此,binary!是一系列范围受限的integer!

不幸的是,这在R2中不起作用,因为它的二进制!模型刚刚以很多微小方式被打破,包括上述方式。虽然在概念上是二进制!在R2中可以被认为是一系列的问题,这个概念并不是一贯实现的。

答案 1 :(得分:1)

>> buffer: #{DECAFBAD}
== #{DECAFBAD}

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

>> append buffer data/1
== #{DECAFBADFF}

答案 2 :(得分:0)

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

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

看来完整性,Rebol 3会有一个BYTE!类型,称之为“INTEGER系列!”显然与STRING设定的先例不符!

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