2013-01-18 36 views
2

在雷博爾2,可以使用to char!生產什麼是一個有效的單字節,你可以在操作使用上的二進制如追加:如何使用單個字節和二進制文件!在Rebol 3中的字節數組?

>> buffer: #{DECAFBAD} 
>> data: #{FFAE} 
>> append buffer (to char! (first data)) 
== #{DECAFBADFF} 

似乎是合理的。但在雷博爾3,你會得到不同的東西:

>> append buffer (to char! (first data)) 
== #{DECAFBADC3BF} 

這是因爲它沒有單字符作爲單字節(由於Unicode)的模型。所以first data(255)的整數值轉換成兩個字節:

>> to char! 255 
== #"ÿ" 
>> to binary! (to char! 255) 
== #{C3BF} 

鑑於CHAR!不再等同於Rebol 3中的一個字節,也沒有BYTE!數據類型被添加了(這樣一個BINARY!可以被認爲是這些BYTE!的一系列,就像一個STRING!是一系列的CHAR!),這種情況應該怎麼辦?

回答

2

使用integer!,這是我們目前在R3中表示一個字節時最接近的匹配。

注意以字節爲單位的binary!的上下文中使用時整數是範圍檢查:

>> append #{} 1024 
** Script error: value out of range: 1024 
** Where: append 
** Near: append #{} 1024 

爲了您的第一個例子,你居然一個系列的一個元素追加到另一個系列相同類型的。在R3可以在明顯和最直接的方式表達這樣的:

>> append #{DECAFBAD} first #{FFAE} 
== #{DECAFBADFF} 

所以對於這個問題,一個binary!是一系列範圍受限integer!秒。

不幸的是,這不會在R2,因爲它的二進制!模型以許多微小的方式被打破,包括上述。在概念上是一個二進制!在R2中可以被認爲是一系列的char!s,這個概念並沒有被一貫地實現。

+0

由於嘗試做一些可能非常少見的事情(使代碼庫在R2或R3上運行),我並不總是注意到「簡單」的答案。看到這一點,我認爲範圍檢查並不是那麼糟糕,我必須進一步考慮它...... – HostileFork

0

對於Rebol 2和Rebol 3中的問題,最簡單的解決方法是使用COPY/PART。通過這種方式,不是試圖將您的內容減少爲一個字節值,而是將其保留爲二進制序列類型。你只是追加長度爲1的二進制序列:

>> append buffer (copy/part data 1) 
== #{DECAFBADFF} 

它似乎是爲了完整性,雷博爾3將有一個字節!類型,稱之爲「一系列INTEGER!」顯然不符合STRING設定的先例!

這是open source,所以你(嗯,我?)可能會嘗試添加它並查看完整的後果是什麼。 :-)

1
>> buffer: #{DECAFBAD} 
== #{DECAFBAD} 

>> data: #{FFAE} 
== #{FFAE} 

>> append buffer data/1 
== #{DECAFBADFF} 
+0

正如@earl指出的那樣,這在R3中起作用。但不是R2,在那裏你可以得到神祕的'#{DECAFBAD323535}':-)聽起來像共識是二元的!在R2中是有點... ...並且只與將事情轉化爲CHAR的非常向前看的想法一起工作,這應該不會在今後完成。我的答案有*「如果您需要您的代碼在R2和R3中運行,請執行此操作」*解決方案... – HostileFork

相關問題