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

X.690: ASN.1のBER方式の共通部分の存在型を利用したコーディング: データ型

(工事中 90%)

Asnable.hs

ASN.1で符号化可能という性質

ASN.1で符号化可能という性質を示すクラスを作成する。実際には、ここで定義するのは、符号化できるという性質ではなく、AsnableBoxから出すために、Asn1Tagで判別可能という性質である。

class Asnable a where
	getAsn1Tag :: a -> Asn1Tag

Asn1Tagについては存在型を使わないコーディングのデータ型を参照。

Asnableなものを入れる箱

Asnableを満たす型を格納する箱を作成する。

data AsnableBox =
	forall a . (Typeable a, Asnable a) => AsnableBox a
	deriving Typeable

箱自体もAsnableとする

instance Asnable AsnableBox where
	getAsn1Tag (AsnableBox a) = getAsn1Tag a

箱から取り出す関数

「存在型: 中身の取り出し」を参照。

getAsnable :: Typeable a => AsnableBox -> Maybe a
getAsnable (AsnableBox a) = cast a

基本的なAsnableな型を用意

data Raw = Raw Asn1Tag ByteString
	deriving (Show, Typeable)
data RawConstructed = RawConstructed Asn1Tag [AsnableBox]
	deriving Typeable

テストのためにRawConstructedをShowにする

Showクラスについての説明を参照。

instance Show RawConstructed where
	showsPrec d (RawConstructed t _) =
		showParen (d > 10) $
			showString "RawConstructed " .
			showsPrec 11 t . showString " [...]"

それぞれの型をAsnableのインスタンスに

instance Asnable Raw where
	getAsn1Tag (Raw t _) = t
instance Asnable RawConstructed where
	getAsn1Tag (RawConstructed t _) = t

「存在型を利用」のトップにもどる 「デコード関数」へ

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