---
title: 编译工具使用
description: "编译工具hiasn1cli，位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本，并将ASN.1脚本转换为C语言代码的中间文件（包含多个源文件和头文件）。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengaccel/system-lib/kslans1/kunpengaccel_ksl_16_0153.html
sourcePath: /source/zh/kunpengaccel/system-lib/kslans1/kunpengaccel_ksl_16_0153.html
indexId: 9826b9684d7afeb9d7b7beca5c476fb276c36b64206298c1ddebd72bf584e32c72
---
# 编译工具使用

编译工具hiasn1cli，位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本，并将ASN.1脚本转换为C语言代码的中间文件（包含多个源文件和头文件）。

在本章节的示例中，将展示如何使用编译工具hiasn1cli将.asn文件转换为C语言源码文件。

#### 获取帮助

执行以下命令获取命令相关帮助。

```
./hiasn1cli --help
```

输出如下回显信息。

```
ASN.1 Compiler, hiasn1cli 2.3.1
Copyright (c) 2023-2026 Huawei Technologies Co., Ltd.

USAGE:
    hiasn1cli [OPTIONS] [SUBCOMMANDS] ...

OPTIONS:
    -v, --version
        Display version information.
    -h, --help
        Display this help information.
    -i, --input <files>
        Select ASN.1 files, such as -i a.asn b.asn, or use wildcards, such as -i *.asn
    --merge <directory name>
        Merge and compile all input ASN.1 files to generate target files.
        Multi-level directories is supported, for example, a/b/c, the final output directory is exports/a/b/c.
        Each ASN.1 file is compiled and exported independently without merging.
    -m, --method <aper|uper|ber|der|xer>
        Specifies the codec method.

SUBCOMMANDS:
    cc  Compiling ASN.1 files into C code.
```


#### 子参数

该工具还有一系列子参数，例如cc子参数的帮助信息可执行以下命令查看。

```
./hiasn1cli cc --help
```

输出如下回显信息。

```
Compiling ASN.1 files into C code.

USAGE:
    hiasn1cli [OPTIONS] cc [FLAGS]

FLAGS:
    -h, --help      Display this subcommand help information.
    --values        Generate definitions for all values.
    --static-array  Define arrays using static array. Dynamic array are used by default.
    --prefix        Add prefix to files and types.
    --sample-code   Generate a code framework that traverses all data structures.
    --ignore-version-brackets  Ignore the version brackets of SEQUENCE.
```

cc子命令参数说明：- --values：生成codec_values.c 、codec_values.h两个文件，用于定义和声明脚本中的值。
- --static-array：使用静态数组的方式定义数组，默认情况下以动态数组的方式定义。
- --prefix：给生成的文件名和类型名增加前缀，前缀的生成规则与上文中介绍的exports目录的子目录命名规则一致。
- --sample-code：生成5个文件，是展示编解码和数据结构遍历的完整可执行示例：

  - sample_code.c、sample_code.h：用于遍历数据结构的代码框架。
  - sample_value.c、sample_value.h：用于结构体字段赋值。
  - sample_main.c：ASN.1 脚本中第一个类型的编解码流程的main函数。
- --ignore-version-brackets：忽略SEQUENCE的版本括号。该参数是为了在这个特性上能够跟开源软件asn1c保持一致而设置的。


#### 示例

将一个ASN.1脚本test.asn转换成BER模式的C代码文件。

1. 新建测试目录“test_demo”后进入该目录。
  1 2 mkdir test_demo cd test_demo

2. 在“test_demo”目录下新建一个test.asn文件。
  1 vim test.asn

3. 按“i”进入编辑模式，输入如下脚本内容：

```
MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN
OctStrType ::= OCTET STRING(SIZE(0..3))
MyType ::= SEQUENCE {
boolType BOOLEAN,
intType INTEGER(0..128),
enumType ENUMERATED { a, b },
bitStrType BIT STRING(SIZE(24)),
seqOfType SEQUENCE OF OctStrType,
choiceType CHOICE {
a INTEGER(0..3),
b BOOLEAN
},
oidType OBJECT IDENTIFIER
}
END
```


4. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
5. 使用hiasn1cli命令进行转换。
```
/usr/local/ksl/bin/hiasn1cli -i test.asn -m aper cc
```

生成的代码文件位于“test_demo/exports”目录。```
exports 
└── test 
    ├── codec_index.h 
    ├── codec_interfaces.h 
    └── codec_tables.c
```


  - codec_index.h：定义了各个数据单元的唯一标识，在后续的编解码接口中需要使用到它们。
  - codec_interfaces.h：提供了抽象语法中数据描述的C程序接口。
  - codec_tables.c：定义了用于描述各个数据类型的静态变量。
