2017-10-12 3 views
1

Ich versuche, ein Basic Encoding Rules Codec in D zu schreiben, und ich möchte die Möglichkeit haben, Daten mit unbestimmter Länge Codierung zu kodieren, in dem das Längenbyte auf 0x80 festgelegt ist und das Ende der Wertbytes mit einem Doppelpunkt abgegrenzt ist null 0x00 0x00 (Ende des Inhalts). Es gibt jedoch Zeiten, in denen eine doppelte Nullstelle Teil des tatsächlich codierten Werts ist. Wenn Sie beispielsweise eine OCTET STRING haben, könnten zwei benachbarte Bytes 0x00 0x00 sein, was als END OF CONTENT statt nur eines Teils des codierten Werts interpretiert würde, was zur Kürzung des codierten Werts führt (Best-Case-Szenario). Gibt es eine Möglichkeit, doppelte Nullen zu codieren, ohne dass sie als END OF CONTENT interpretiert werden? Oder wird von Ihnen erwartet, nur Werte zu codieren, die keine doppelten Nullen haben? Ich habe noch nichts darüber in irgendeiner Spezifikation gefunden.Wie entkommst du Double-NULL-Oktetts innerhalb eines Oktetts, der mit unbestimmter Länge in BER codiert ist?

Antwort

2

Sie setzen nie einen reinen OCTET STRING-Inhalt zwischen 0x80 und 0x00 0x00. Stattdessen legst du [wahrscheinliche Stücke] von eindeutig kodierten OCTET STRING dorthin.

Mit anderen Worten, unbestimmter Länge codiert, chunked Single-Oktett "AB" ASCII-Zeichenfolge (zB 0x41 0x42 in hex) würde wie folgt aussehen:

0x24 0x80  0x04 0x01 0x41  0x04 0x1 0x42  0x00 0x00 
^   ^    ^    ^
outer header inner chunk #1  inner chunk #2 outer EOO sentinel 

Das Endergebnis ist, dass der Decoder nicht über um die tatsächliche Nutzlast zu scannen, die nach einer EOO-Markierung sucht, da die Nutzlastmargen durch die eindeutig Längencodierten Stücke klar definiert sind.

+0

In diesem Fall sollte der äußere Header als Konstruktor dargestellt werden, so dass er als 0x24 codiert werden sollte. Es wird das Bit 6 des Identifier-Tags (P/C) auf Constructed gesetzt. – pepo

+0

@pepo Tatsächlich! Vielen Dank! ;-) –

Verwandte Themen