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初步了解相关推荐

  1. 对asn.net三层架构的初步认识

    从接触三层架构到现在有两三个月的时间了,从听说时候的一头雾水到中期对各个层的迷迷糊糊(现在还有点迷惑不过好多了),还有就是今天的不完全了解,虽然进展的很慢,但是总算是有了一点点的眉目,废话少说来看下具 ...

  2. 变化资产的 ASN分布情况

    变化资产的 ASN分布情况 观察 3: 国内运营商中,国信比邻.广东省联通的物联网资产变化率最高,达 60%以上,导致这 一现象原因可能与资产的分布以及运营商的具体业务有关. 上文初步得出,物联网设备 ...

  3. GMSSL开源库--初步接触SM2

    2021SC@SDUSC 目录 一.整体情况 二.sm2_asn1.c 一.整体情况 在有关OPENSSL的一本书上看到了OPENSSL部分目录功能说明,Crypto目录中存放OpenSSL所有加密算 ...

  4. TensorRT 7.2.1开发初步

    TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...

  5. SOC,System on-a-Chip技术初步

    SOC,System on-a-Chip技术初步 S O C(拼作S-O-C)是一种集成电路,它包含了电子系统在单个芯片上所需的所有电路和组件.它可以与传统的计算机系统形成对比,后者由许多不同的组件组 ...

  6. 《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步

    第3章 HighGUI图形用户界面初步 3.1 图像的载入.显示和输出到文件 1.OpenCV命名空间2种访问方法 (1)代码开头加:usingnamespace cv; (2)每个类或函数前加:cv ...

  7. 初步判断内存泄漏方法

    有时候,内存泄漏不明显,或者怀疑系统有内存泄漏,我们可以通过下面介绍的方法初步确认系统是否存在内存泄漏. 首先在Java命令行中增加-verbose:gc参数, 然后重新启动java进程. 当系统运行 ...

  8. android蓝牙4.0(BLE)开发之ibeacon初步

    一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...

  9. ASN.1简介及OpenSSL中ASN.1接口使用举例

    ASN.1(Abstract Syntax Notation One)是一套标准,是描述数据的表示.编码传输.解码的灵活的记法.它提供了一套正式.无歧义和精确的规则以描述独立于特定计算机硬件的对象结构 ...

最新文章

  1. SQLServer之创建INSTEAD OF INSERT,UPDATE,DELETE触发器
  2. 微软正在帮助政府构建AI灾难响应工具
  3. React状态管理大乱斗,横向对比Dva,Rematch,Mirror
  4. UOJ58 【WC2013】糖果公园
  5. 中石油训练赛 - 位置(模拟+思维)
  6. java多线程 future_Java多线程Future模式
  7. CPU多核并发缓存架构介绍
  8. 搜狗拼音皮肤 php文件,搜狗输入法皮肤制作教程(组图版)
  9. 什么是LoRa协议?
  10. 数学家是如何做量化交易的
  11. gif 格式图片详解
  12. 在PS中快速制作发朋友圈的九宫格切图
  13. 斐波那契数列(经典兔子繁殖问题)
  14. 关闭2345,搜狐等软件的弹窗
  15. 海格里斯智能自动化立体库仓储管理系统 物流生鲜电商冷链立库应用
  16. [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
  17. ISIS Neighbor Net Type DIS
  18. 欢迎到我们的学海灯塔给我们留言
  19. FileReader的编码问题
  20. MYSQL数据库----删除命令

热门文章

  1. Maven搭建私有仓库(私服)
  2. 详解如何用爬虫批量抓取百度搜索多个关键字数据
  3. 1032-左右两边子数组的和相等
  4. IOS 9.3.3更后打电话没声音解决方法
  5. android进、线程间通信方式
  6. 城市轨道交通信号系统学习笔记(二)信号系统的组成
  7. Windows自带光驱将多个镜像文件加载到同一个光驱下
  8. 【雕爷学编程】Arduino动手做(54)---大按键点动模块
  9. 韩系高端PK:whoo后VS雪花秀(转载)
  10. jpa onetomany 从one那一方查询many的一方