asn java_ASN.1初步了解
0.作业要求
使用ASN.1编写一个数据结构。数据结构自己考虑。
分别使用asn1c、JavaAsn1Compiler等对这个数据结构进行编译。
使用c/java/python进行编码,并存储,而后用另外一种编程语言进行解码,比如,用C编码,可以用java或者python解码。
对“要求一”中的数据结构,使用protobuffer实现一次。这里不强制要求不同的语言实现编码和解码。
1.使用ASN.1编写一个数据结构
数据结构如下所示:
由两个INTEGER型和两个OCTET STRING型的数据构成
RectangleModule1 DEFINITIONS ::=
BEGIN
Rectangle ::= SEQUENCE {
height INTEGER,
width INTEGER,
author OCTET STRING,
title OCTET STRING
}
END
2.分别使用asn1c、JavaAsn1Compiler等对这个数据结构进行编译
asn1c -fnative-types rectangle.asn1
由于编译出的文件过多,下图只截取部分编译结果
htkz@htkz:~/Desktop/ASN1/ASN.1$ asn1c -fnative-types rectangle.asn
然后是java
htkz@htkz:~/java_asn1/src$ java -jar JAC.jar -d ~/java_asn1/src/jac_test -p rectangle rectangle.asn1
3.编程实现编码与解码
本次编程选择使用Java进行编码,然后使用python进行解码
3.1 Java编码
在之前使用的JavaAsn1Compiler编译出来的类中添加如下代码,来给数据数据结构赋值
public static void main(String []args) {
// 创建输出流变量
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
BerOutputStream out = new BerOutputStream(outStream);
// 对rec这个类进行赋值
// 赋值结果为rec(author= b'1234', title = b'1234', height = 1011, width = 21)
Rectangle rec = new Rectangle();
byte[] name = new byte[4];
name[0] = '1';
name[1] = '2';
name[2] = '3';
name[3] = '4';
rec.author.setValue(name);
rec.title.setValue(name);
rec.height.setValue(1011);
rec.width.setValue(21);
// 对输出变量进行编码
try {
rec.encode(out);
System.out.println(out.toString());
}catch (java.io.IOException e1){
System.out.println(e1);
}
// 将编码后的结果写入test_rec文件,此时文件是二进制数据
File f = new File("test_rec");
try{
OutputStream outFile = new FileOutputStream(f);
try{outFile.write(outStream.toByteArray());}
catch (java.io.IOException e2){
System.out.println(e2);
}
}catch(java.io.FileNotFoundException e1){
System.out.println(e1);
}
PS:java文件的运行需要导入JAC.jar的包,这个包就在之前使用的JavaAsn1Compiler_3.0中,具体路径如下
JavaAsn1Compiler_3.0/lib/JAC.jar
程序运行之后会在代码路径下生成编码后的二进制文件test_rec_2,这个文件中的数据为rec(author= b'1234', title = b'1234', height = 1011, width = 21),之后使用python对这个文件进行解码
3.2 python解码
首先在python中定义相应的类rectangle.py
from pyasn1.type import univ, namedtype
class Rectangle(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('height', univ.Integer()),
namedtype.NamedType('width', univ.Integer()),
namedtype.NamedType('author', univ.OctetString()),
namedtype.NamedType('title', univ.OctetString()),
)
PS:本来这个类按照pyasn1官方文档的方法,应该是使用asn1ate 这个工具来直接识别asn文件获取类的解构,就像前面的asn1c和 JavaAsn1Compiler一样,但是我git clone下来之后发现asn1ate这个工具还是有一点问题,就懒得调试了,没有用它。而是直接在pyasn1-modules中找了样例,直接自己手写了一个。
之后就是解码相关文件的代码了,相当简洁
from pyasn1.codec.der.decoder import decode as der_decoder
from rectangle import Rectangle
if __name__ == "__main__":
text = file = open('test_rec', 'rb').read()
result = der_decoder(text, asn1Spec=Rectangle())
print(result[0].prettyPrint())
4.protobuffer实现
首先根据上述数据结构编写proto文件如下
message Rectangle {
required int32 height = 1;
required int32 width = 2;
optional string author = 3;
optional string title = 4;
}
下载protobufgitfer
git clone https://github.com/google/protobuf.git
之后使用如下指令生成python、java、cpp文件
protoc --proto_path= rectangle.proto --python_out ./
protoc --proto_path= rectangle.proto --cpp_out ./
protoc --proto_path= rectangle.proto --java_out ./
asn java_ASN.1初步了解相关推荐
- 对asn.net三层架构的初步认识
从接触三层架构到现在有两三个月的时间了,从听说时候的一头雾水到中期对各个层的迷迷糊糊(现在还有点迷惑不过好多了),还有就是今天的不完全了解,虽然进展的很慢,但是总算是有了一点点的眉目,废话少说来看下具 ...
- 变化资产的 ASN分布情况
变化资产的 ASN分布情况 观察 3: 国内运营商中,国信比邻.广东省联通的物联网资产变化率最高,达 60%以上,导致这 一现象原因可能与资产的分布以及运营商的具体业务有关. 上文初步得出,物联网设备 ...
- GMSSL开源库--初步接触SM2
2021SC@SDUSC 目录 一.整体情况 二.sm2_asn1.c 一.整体情况 在有关OPENSSL的一本书上看到了OPENSSL部分目录功能说明,Crypto目录中存放OpenSSL所有加密算 ...
- TensorRT 7.2.1开发初步
TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...
- SOC,System on-a-Chip技术初步
SOC,System on-a-Chip技术初步 S O C(拼作S-O-C)是一种集成电路,它包含了电子系统在单个芯片上所需的所有电路和组件.它可以与传统的计算机系统形成对比,后者由许多不同的组件组 ...
- 《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步
第3章 HighGUI图形用户界面初步 3.1 图像的载入.显示和输出到文件 1.OpenCV命名空间2种访问方法 (1)代码开头加:usingnamespace cv; (2)每个类或函数前加:cv ...
- 初步判断内存泄漏方法
有时候,内存泄漏不明显,或者怀疑系统有内存泄漏,我们可以通过下面介绍的方法初步确认系统是否存在内存泄漏. 首先在Java命令行中增加-verbose:gc参数, 然后重新启动java进程. 当系统运行 ...
- android蓝牙4.0(BLE)开发之ibeacon初步
一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...
- ASN.1简介及OpenSSL中ASN.1接口使用举例
ASN.1(Abstract Syntax Notation One)是一套标准,是描述数据的表示.编码传输.解码的灵活的记法.它提供了一套正式.无歧义和精确的规则以描述独立于特定计算机硬件的对象结构 ...
最新文章
- SQLServer之创建INSTEAD OF INSERT,UPDATE,DELETE触发器
- 微软正在帮助政府构建AI灾难响应工具
- React状态管理大乱斗,横向对比Dva,Rematch,Mirror
- UOJ58 【WC2013】糖果公园
- 中石油训练赛 - 位置(模拟+思维)
- java多线程 future_Java多线程Future模式
- CPU多核并发缓存架构介绍
- 搜狗拼音皮肤 php文件,搜狗输入法皮肤制作教程(组图版)
- 什么是LoRa协议?
- 数学家是如何做量化交易的
- gif 格式图片详解
- 在PS中快速制作发朋友圈的九宫格切图
- 斐波那契数列(经典兔子繁殖问题)
- 关闭2345,搜狐等软件的弹窗
- 海格里斯智能自动化立体库仓储管理系统 物流生鲜电商冷链立库应用
- [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
- ISIS Neighbor Net Type DIS
- 欢迎到我们的学海灯塔给我们留言
- FileReader的编码问题
- MYSQL数据库----删除命令