使用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:使用自定义类型映射文件
- 创建一个类型映射文件(比如命名为
int_types.map),内容如下:
INTEGER int
- 编译时通过
-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é
相关产品推荐
相关产品推荐

