You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用asn1c编译器:INTEGER类型生成long而非int的解决诉求

解决asn1c编译ASN.1 INTEGER生成long而非int的问题

问题背景

ASN.1代码:

RectangleTest DEFINITIONS ::=
BEGIN
 Rectangle ::= SEQUENCE {
 height INTEGER,     
 width INTEGER         
 }
END

使用asn1c编译后生成的C++结构体中,INTEGER被映射为long,而非预期的int:

/* Rectangle */
typedef struct Rectangle {
 long     height;
 long     width;
 
 /* Context for parsing across buffer boundaries */
 asn_struct_ctx_t _asn_ctx;
} Rectangle_t;

已尝试-fwide-types选项无效,需要将INTEGER对应为C++的int类型。

原因

asn1c默认将无范围约束的INTEGER映射为long——因为ASN.1标准中INTEGER的取值范围没有上下限,long能覆盖更大的数值范围,避免溢出风险。

解决方案

方法1:给ASN.1的INTEGER添加范围约束

在ASN.1代码中明确限定INTEGER的取值范围为C++ int的有效范围(通常是-2147483648..2147483647),asn1c会自动将其映射为int:

RectangleTest DEFINITIONS ::=
BEGIN
 Rectangle ::= SEQUENCE {
 height INTEGER (-2147483648..2147483647),     
 width INTEGER (-2147483648..2147483647)         
 }
END

方法2:使用自定义类型映射文件

  1. 创建一个类型映射文件(比如命名为int_types.map),内容如下:
INTEGER int
  1. 编译时通过-typemap参数指定该文件:
asn1c -typemap int_types.map your_asn_file.asn

方法3:使用asn1c的-fno-integer64选项

如果你的环境中int和long长度相同(比如32位系统),可以尝试用-fno-integer64选项编译,强制asn1c使用32位整数类型:

asn1c -fno-integer64 your_asn_file.asn

注意:方法3依赖系统的整数类型长度,跨平台移植时可能存在兼容性问题,优先推荐方法1或方法2。

内容的提问来源于stack exchange,提问作者José

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:38:14