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