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 ответ

Решение

Вы столкнулись с известной ошибкой. (корректирующий запрос на извлечение уже отправлен, 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
Другие вопросы по тегам