asn.1 =抽象语法注释一。我知道它可以定义某些类型的数据,并且通过使用asn1c编译器,我们可以将Rectangle.asn转换为某些.c和.h文件。然后,我们可以使用这些.c和.h文件对不同形式的数据(ber,per,xer等)进行编码或解码。但是如何?我有一个名为Rectangle.asn的文件:

RectangleTest DEFINITIONS ::= BEGIN

Rectangle ::= SEQUENCE {
    height INTEGER, -- Height of the rectangle
    width INTEGER -- Width of the rectangle
}

END


asn1c Rectangle.asn命令带来了许多.c和.h文件。诸如Rectangle.h和Rectangle.c之类的相关文件并不是我所关心的那么简单。为什么结构嵌套?为什么有一个名为INTEGER_t的数据类型,而不仅仅是int?我很困惑,我只想发送序列化的rect = {10,20}时,对如何真正使用这些.c和.h文件一无所知?请帮忙!
Rectangle.h和Rectangle.c上的一些代码

/* Rectangle */
typedef struct Rectangle {
    INTEGER_t    height;
    INTEGER_t    width;

    /* Context for parsing across buffer boundaries */
    asn_struct_ctx_t _asn_ctx;
} Rectangle_t;


#include "Rectangle.h"

static asn_TYPE_member_t asn_MBR_Rectangle_1[] = {
    { ATF_NOFLAGS, 0, offsetof(struct Rectangle, height),
        (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
        0,
        &asn_DEF_INTEGER,
        0,  /* Defer constraints checking to the member type */
        0,  /* PER is not compiled, use -gen-PER */
        0,
        "height"
        },
    { ATF_NOFLAGS, 0, offsetof(struct Rectangle, width),
        (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
        0,
        &asn_DEF_INTEGER,
        0,  /* Defer constraints checking to the member type */
        0,  /* PER is not compiled, use -gen-PER */
        0,
        "width"
        },
};
static ber_tlv_tag_t asn_DEF_Rectangle_tags_1[] = {
    (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_Rectangle_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 4 */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* width at 6 */
};
static asn_SEQUENCE_specifics_t asn_SPC_Rectangle_specs_1 = {
    sizeof(struct Rectangle),
    offsetof(struct Rectangle, _asn_ctx),
    asn_MAP_Rectangle_tag2el_1,
    2,  /* Count of tags in the map */
    0, 0, 0,    /* Optional elements (not needed) */
    -1, /* Start extensions */
    -1  /* Stop extensions */
};

最佳答案

您需要阅读有关ASN.1的更多信息。

它解决的问题是不同计算机上的事物并不完全相同。如果要将数据从嵌入式x86 DOS系统(16位小端整数)发送到SPARC(32位大端整数),则不能只在两面都使用int

ASN.1有​​两个主要部分:


语言描述,即ASN.1语法
应用语法将主机数据与编码数据进行相互转换的编码规则


asn1c web site上有一些示例。

关于c - 在互联网上传输数据时如何使用asn.1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48463901/

10-10 20:56