top page > computer > web > rfc > x_690 > 8_1_common > coding > existential > ber_encode.html
更新日:
文責: 重城良国

X.690: ASN.1のBER方式の共通部分の存在型を利用したコーディング: エンコード関数を値自体に

(中断 1%)

Berクラス

class Ber b where
	...
	encodeRule :: b -> BS.ByteString
	setEncodeRule :: b -> (b -> BS.ByteString) -> b

今回のバージョンでは長さの表現にバリエーションがあることから、encodeRuleは長さの部分のエンコードも含むことにする。ただしタグの部分は一意に決まるので、ここはクラス関数外にくくり出すことにした。

encode関数

encode :: Ber b => b -> BS.ByteString
encode b = encodeTag (getAsn1Tag b) `append` encodeRule b

RawConstructedのデータ型にエンコード関数を追加する

data RawConstructed = RawConstructed
	(Maybe (RawConstructed -> BS.ByteString))
	Asn1Tag [BerBox]

Derクラス

Derクラスは値に対してDerエンコード関数を設定する方法を定義する。

class Der d where
	setDerRule :: b -> b

RawConstructedの値にエンコード関数を設定する

無限後退の予感:-(

やめたやめた

この路線ではうまくいかない。たいていにおいてデコードとエンコードはうまくペアにならないのだ。それならば、デコードの結果専用の型とエンコード専用の型を作って、デコード専用の型から型Tへの変換関数と、型Tからエンコード専用の型への変換関数を作るほうが良さそうだ。

「存在型を利用」トップへ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics