【问题标题】:How can I work with a single byte and binary! byte arrays in Rebol 3?我如何使用单个字节和二进制文件! Rebol 3 中的字节数组?
【发布时间】:2013-01-18 18:40:14
【问题描述】:

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

>> 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!就像 STRING!是一系列 CHAR!),对于这种情况该怎么办?

【问题讨论】:

    标签: unicode utf-8 bytearray rebol rebol3


    【解决方案1】:

    使用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!s。

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

    【讨论】:

    • 由于尝试做一些可能非常罕见的事情(使代码库在 R2 或 R3 上运行),我并不总是注意到“简单”的答案。看到这行得通,我想范围检查还不错,我得进一步考虑......
    【解决方案2】:
    >> buffer: #{DECAFBAD}
    == #{DECAFBAD}
    
    >> data: #{FFAE}
    == #{FFAE}
    
    >> append buffer data/1
    == #{DECAFBADFF}
    

    【讨论】:

    • 是的,正如@earl 指出的那样,这在 R3 中有效。但不是 R2,在那里你会得到神秘的 #{DECAFBAD323535} :-) 听起来共识就是二进制!在 R2 中有点无聊......并且只使用了将事物变成 CHAR 的不太具有前瞻性的想法!,今后不应该这样做。我的答案是 “如果您需要代码在 R2 和 R3 中运行,请执行此操作” 解决方案...
    【解决方案3】:

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

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

    为了完整起见,Rebol 3 似乎确实有一个 BYTE!类型,称之为“整数系列!”明显不符合STRING的先例!

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

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2017-02-26
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多