2013-08-08 4 views
1

Я пытаюсь скопировать двоичные данные в массив, и я получаю результат, которого я не ожидаю. Я уменьшил ее до этой более мелкой проблемы, которая ее демонстрирует.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 []

ответ

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 
+0

Благодарим за объяснение Ladislav. Что касается 1-го из ваших примеров, существует ли другой способ создания двоичного кода длиной менее 8? Я отредактировал свой ответ выше с ответом. Конечно, я настроюсь на использование 'append', но мне было просто любопытно. – kealist