Я пытаюсь скопировать двоичные данные в массив, и я получаю результат, которого я не ожидаю. Я уменьшил ее до этой более мелкой проблемы, которая ее демонстрирует.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}
с моим повторным блоком, но я не konw, где это происходит из. Я проверил с 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}]
Ответ на Ladislavs ответ:
Спасибо за ответ про ошибки.
Первый пример дает другой результат, чем то, что я ожидаю. Двоичные элементы каждой из 8 длины, тогда как я был заинтересован в длину 1 (отсюда и использование блока аргумента to-binary
.)
>> c
== [#{0000000000000001} #{0000000000000002} #{0000000000000003} #{0000000000000004} #{0000000000000005} #{0000000000000006} #{0000000000000007} #{0000000000000008}]
Вторые работы, путем замены c: array (length? b)
с c: copy []
Благодарим за объяснение Ladislav. Что касается 1-го из ваших примеров, существует ли другой способ создания двоичного кода длиной менее 8? Я отредактировал свой ответ выше с ответом. Конечно, я настроюсь на использование 'append', но мне было просто любопытно. – kealist