REBOL3 - 如何从二进制复制二进制!阻止!正确

时间:2013-08-08 17:06:21

标签: rebol rebol3

我正在尝试将二进制数据复制到数组中,并且我得到了一个我没想到的结果。我把它缩小到这个演示它的小问题。

b: #{0102030405060708}
c: array (length? b)
repeat num (length? b) [
    print [
        {Setting location}
        num
        {to value of}
        to-binary reduce [(pick b num)]
    ] 
    poke c num (to-binary reduce [(pick b num)]) 
]

这导致:

Setting location 1 to value of #{01}
Setting location 2 to value of #{02}
Setting location 3 to value of #{03}
Setting location 4 to value of #{04}
Setting location 5 to value of #{05}
Setting location 6 to value of #{06}
Setting location 7 to value of #{07}
Setting location 8 to value of #{08}
== #{08}

>> c
== [#{08} #{08} #{08} #{08} #{08} #{08} #{08} #{08}]

我可以看到我正在使用我的重复块返回==#{08},但我不知道它来自哪里。我检查了trace on,似乎poke语句在重复的每一步都设置了块的所有元素。这似乎是一个指针问题,我可以使用copy来解决它。有人能告诉我发生了什么吗?

更多测试:

>> to-binary reduce [pick b 1]
== #{01}

>> poke c 1 to-binary reduce [pick b 1]
== #{01}

>> c
== [#{01} #{01} #{01} #{01} #{01} #{01} #{01} #{01}]

>> poke c 2 #{02}
== #{02}

>> c
== [#{01} #{02} #{01} #{01} #{01} #{01} #{01} #{01}]

>> u: to-binary reduce [pick b 4]
== #{04}

>> poke c 4 u
== #{04}

>> c
== [#{04} #{02} #{04} #{04} #{04} #{04} #{04} #{04}]

回应拉迪斯拉夫斯回答:

感谢您对该错误的回答。

第一个例子给出了与我期望的结果不同的结果。二进制元素各有8个长度,而我对长度1感兴趣(因此使用块参数to-binary。)

>> c
== [#{0000000000000001} #{0000000000000002} #{0000000000000003} #{0000000000000004} #{0000000000000005} #{0000000000000006} #{0000000000000007} #{0000000000000008}]

第二种作品,将c: array (length? b)替换为c: copy []

1 个答案:

答案 0 :(得分:3)

您遇到了一个已知错误。 (纠正拉取请求已经提交,AFAIK)解决方法是永远不要使用块作为to-binary函数的参数。以下代码应该有效:

b: #{0102030405060708}
c: array (length? b)
repeat num (length? b) [
    print [
        {Setting location}
        num
        {to value of}
        to-binary pick b num
    ] 
    poke c num to-binary pick b num 
]

但是,整个代码看起来过于复杂,我宁愿使用以下方法实现您的目标:

b: #{0102030405060708}
c: make block! length? b
repeat num (length? b) [
    print [
        {Setting location}
        num
        {to value of}
        copy/part at b num 1
    ]
    append c copy/part at b num 1
]

如果您只想从整数创建一个短(长度为1)的二进制文件,可以使用以下公式:

append copy #{} 255