2013-01-07 23 views
1

考慮以下幾點:可以解析二進制文件!在Rebol 2中捕獲一個二進制文件!而不是一個字符串! (如在Rebol 3中)?

>> bin: to-binary {Rebol} 
== #{5265626F6C} 

>> parse/all bin [s: to end] 
== true 

我希望s已經捕捉到的二進制序列的頭部,並類型BINARY的!在雷博爾3是這種情況:

>> type? s 
== binary! 

>> s == bin 
== true 

在雷博爾2,似乎解析必須轉換的數據爲字符串(或至少是「成像」的二進制作爲字符串罩下和!不比較相等)

>> type? s 
== string! 

>> s == bin 
== false 

由於雷博爾2不是Unicode,二進制字節串和字符串基本上都是相等的。但隨着雷博爾3的Unicode的我估計你可能最終得到了非常不同的行爲,如果你寫道:

parse/all to-string bin [s: to end] 

,因爲它會開始解釋多字節序列劃分成字符串編碼,這不,如果你真的想要的是工作未解釋的字節。 :-(

如果想要編寫在解析BINARY時同樣適用於Rebol 2或Rebol 3的代碼,您將如何解決此問題?(理想情況下,使Rebol 2的行爲更像3,當然。 )

回答

2

事實上,雷博爾2實際上只是「成像」中的數據作爲一個字符串!而不是複製它,注意以下

>> bin: to-binary {Rebol} 
== #{5265626F6C} 

>> parse bin [s: (clear s)] 
== true 

>> s 
== "" 

>> bin 
== #{} 

這是因爲雷博爾2有可用的例程別名字符串數據爲二進制反之亦然:AS-BINARYAS-STRING。不像它們的TO-BINARY和TO -STRING變體,它們實際上並不複製數據。

這裏有一個想法,你(ummmm,好了,我)可以嘗試......做一個兼容性功能(讓我們稱之爲bin-pos):

bin-pos: func [pos [binary! string!]] [ 
    return either string? pos [ 
     ;; we must be using r2, image the parse position back to binary 
     as-binary pos 
    ] [ 
     ;; just a no-op in r3, binary parse input yields binary parse positions 
     pos 
    ] 
] 

所以在上面的例子中,對於雷博爾2正確的事情發生,如果任何你會使用s你,而不是替代bin-pos s

>> type? (bin-pos s) 
== binary! 

>> (bin-pos s) == bin 
== true 

對於您使用COPY方言字和一個新的字符串的情況下作出,同樣的技術將工作......但也許應該使用不同的包裝名稱。 bin-capture

0

你可以只添加一個解析的行動,以確保採集的數據的規則是binary!

>> bin: to binary! {Rebol} 

>> parse/all bin [s: to end (s: to binary! s)] 

>> type? s 
== binary! 

您可以在一個ensure-binary助手把這個包轉換爲文檔的目的。

(需要注意的是,如果我理解你的答案權的最後一段,這基本上是你有什麼建議那裏。不過,我認爲你可以使用這種方法,即使對於沒有copy取得捕捉。)

+0

它得到你是一個二元的,在這個簡單的例子中。但是我說的是更復雜的代碼,它需要進行一致的位置比較,複製範圍並期望這些範圍處於相同的二進制序列中,並且還可以使用':s'等操作解析中的序列位置。*到最後一個要求,更改's'本身並不是一個選項......你在'parse bin [s:to end(s:to binary!s):s]')*上得到一個錯誤雖然類型不是兼容,請參閱我對該系列修改的更新,指出它實際上是引擎蓋下的相同數據... – HostileFork

相關問題