2

Rebol 2 では、to char!追加などのバイナリの操作で使用できる、実質的に 1 バイトのものを生成するために使用できます。

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

理にかなっているようです。しかし、Rebol 3 では、何か違うことがわかります。

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

これは、単一文字を単一バイトとしてモデル化しないためです (Unicode のため)。したがって、(255) の整数値はfirst data2 バイトのシーケンスに変換されます。

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

そのCHARを考えると!は Rebol 3 のバイトと同等ではなくなり、BYTE もありません! datatype が追加されました(BINARY! は、STRING! が一連の CHAR! であるのと同じように、一連の BYTE!s と見なすことができるように)、この種の状況についてはどうすればよいでしょうか?

4

3 に答える 3

2

integer!現時点では、R3 でバイトを表現するのに最も近いを使用します。

a のコンテキストでバイトとして使用される場合、整数は範囲チェックされることに注意してくださいbinary!

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

最初の例では、実際には、あるシリーズの 1 つの要素を同じタイプの別のシリーズに追加します。R3 では、これを明白かつ最も単純な方法で表現できます。

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

さらに言えば、 abinary!は一連の範囲制約付きinteger!s です。

残念ながら、これは R2 では機能しません。これはバイナリであるためです! モデルは、上記を含む多くの小さな点で壊れていました。概念的にはバイナリですが!R2 では一連の char!s と見なすことができますが、その概念は一貫して実装されていません。

于 2013-01-18T19:15:07.533 に答える
1
>> buffer: #{DECAFBAD}
== #{DECAFBAD}

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

>> append buffer data/1
== #{DECAFBADFF}
于 2013-01-19T01:56:52.563 に答える
0

Rebol2とRebol3の両方での問題の最も簡単な回避策は、COPY/PARTを使用することです。このように、コンテンツをバイト値に縮小しようとするのではなく、バイナリシリーズタイプとして保持します。長さ1のバイナリシーケンスを追加するだけです。

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

完全を期すために、Rebol3にはBYTEがあるようです。「INTEGERのシリーズ」と呼んで、タイプします。STRINGによって設定された前例と明らかに一致しません!

それはオープンソースなので、あなた(ええと、私?)はそれを追加して、完全な影響が何であるかを見てみるかもしれません。:-)

于 2013-01-18T19:13:17.630 に答える