Существует одно довольно хакерское решение: вы можете изменить функцию xer_encoder
для типов, которые необходимо печатать, в виде удобочитаемых значений.
В файле asn.1 рядом с определением LDAPString добавьтеновый тип, который ссылается на тип UTF8String
LDAPString ::= OCTET STRING -- UTF-8 encoded,
-- [ISO10646] characters
LDAPStringUTF8 ::= UTF8String
-- [RFC4514]
. Без этого asn1c
не скопирует UTF8String.[hc]
файлов, которые нам понадобятся.
Чем в вашем main
или непосредственно перед вызовом asn_encode
с помощью ATS_BASIC_XER
/ ATS_CANONICAL_XER
добавьте следующий
asn_DEF_LDAPDN.op->xer_encoder = OCTET_STRING_encode_xer_utf8;
и включите заголовок LDAPDN.h
.
Вот полный патч на случайвы используете converter-example.c
и rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
из примеров asn1c
diff --git a/converter-example.c b/converter-example.c
index b540452..bb883b4 100644
--- a/converter-example.c
+++ b/converter-example.c
@@ -189,6 +189,8 @@ ats_by_name(const char *name, const asn_TYPE_descriptor_t *td,
return NULL;
}
+#include "LDAPDN.h"
+
int
main(int ac, char *av[]) {
FILE *binary_out;
@@ -216,6 +218,8 @@ main(int ac, char *av[]) {
#endif
}
+ asn_DEF_LDAPDN.op->xer_encoder = OCTET_STRING_encode_xer_utf8;
+
/* Figure out if a specialty decoder needs to be default */
#ifndef ASN_DISABLE_OER_SUPPORT
isyntax = ATS_BASIC_OER;
diff --git a/pdu_collection.c b/pdu_collection.c
index 4fde16b..55e2c2f 100644
--- a/pdu_collection.c
+++ b/pdu_collection.c
@@ -7,6 +7,7 @@ struct asn_TYPE_descriptor_s; /* Forward declaration */
extern struct asn_TYPE_descriptor_s asn_DEF_LDAPMessage;
extern struct asn_TYPE_descriptor_s asn_DEF_MessageID;
extern struct asn_TYPE_descriptor_s asn_DEF_LDAPString;
+extern struct asn_TYPE_descriptor_s asn_DEF_LDAPStringUTF8;
extern struct asn_TYPE_descriptor_s asn_DEF_LDAPOID;
extern struct asn_TYPE_descriptor_s asn_DEF_LDAPDN;
extern struct asn_TYPE_descriptor_s asn_DEF_RelativeLDAPDN;
@@ -58,6 +59,7 @@ struct asn_TYPE_descriptor_s *asn_pdu_collection[] = {
&asn_DEF_LDAPMessage,
&asn_DEF_MessageID,
&asn_DEF_LDAPString,
+ &asn_DEF_LDAPStringUTF8,
&asn_DEF_LDAPOID,
&asn_DEF_LDAPDN,
&asn_DEF_RelativeLDAPDN,
diff --git a/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 b/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
index 53de3cf..b29ec11 100644
--- a/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
+++ b/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
@@ -47,6 +47,7 @@
LDAPString ::= OCTET STRING -- UTF-8 encoded,
-- [ISO10646] characters
+ LDAPStringUTF8 ::= UTF8String
А вот вывод
./converter-example -iber ldap1.der
<LDAPMessage>
<messageID>1</messageID>
<protocolOp>
<bindRequest>
<version>3</version>
<name>uid=a,dc=com</name>
<authentication>
<simple>password</simple>
</authentication>
</bindRequest>
</protocolOp>
</LDAPMessage>