`
mizhao1984
  • 浏览: 91683 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

利用java开发ASN.1

阅读更多

   最近做电信预付费用户话单(ASN.1格式),由于需求比较急,客户要求尽快搞定。这几天忙的焦头烂额,几乎把google上能查到的asn1相关信息都试了一下,今天终于有了一点成就,并生成了个测试话单……

   初次尝试:

  (Java Asn1 Compiler(JAC)):由于只支持tag值 1-127,所以放弃

  例子:

/**
 * 话单头部
 * @author mizhao
 *
 */
public class HeaderNode extends Sequence {
 
 /**
  * 记录类型
  */
 IA5String recordType = new IA5String("recordType");
 /**
  * 拜访局代码
  */
 IA5String visitBureauCode = new IA5String("visitBureauCode");
 
 /**
  * 归属局代码
  */
 IA5String belongBureauCode = new IA5String("belongBureauCode");
 
 /**
  * 文件序号
  */
 IA5String serialNo = new IA5String("serialNo");
 
 /**
  * 文件产生日期(YYYYMMDDHHMISS)
  */
 IA5String createDate = new IA5String("createDate");
 
 /**
  * 文件版本号
  */
 IA5String versionNo = new IA5String("versionNo");
 
 public HeaderNode(){
  super();
  setUpElements();
 }
 
 public HeaderNode(String name){
  super(name);
  setUpElements();
 }
 
 protected void setUpElements() {
  super.addElement(recordType);
  recordType.setTagClass(Tag.APPLICATION);
  recordType.setTagNumber(ASN1TagConstants.TAG_RECORD_TYPE);
  super.addElement(visitBureauCode);
  visitBureauCode.setTagClass(Tag.APPLICATION);
  visitBureauCode.setTagNumber(ASN1TagConstants.TAG_VISIT_BUREAU_CODE);
  super.addElement(belongBureauCode);
  belongBureauCode.setTagClass(Tag.APPLICATION);
  belongBureauCode.setTagNumber(ASN1TagConstants.TAG_BELONG_BUREAU_CODE);
  super.addElement(serialNo);
  serialNo.setTagClass(Tag.APPLICATION);
  serialNo.setTagNumber(ASN1TagConstants.TAG_SERIAL_NO);
  super.addElement(createDate);
  createDate.setTagClass(Tag.APPLICATION);
  createDate.setTagNumber(ASN1TagConstants.TAG_CREATE_DATE);
  super.addElement(versionNo);
  versionNo.setTagClass(Tag.APPLICATION);
  versionNo.setTagNumber(ASN1TagConstants.TAG_VERSION_NO);
 }

}

测试方法:

//create header
  headerNode.recordType.setValue("10");
  headerNode.visitBureauCode.setValue("46003114");
  headerNode.belongBureauCode.setValue("46003114");
  headerNode.serialNo.setValue("1");
  headerNode.createDate.setValue("20100817142800");
  headerNode.versionNo.setValue("10");

 

  ByteArrayOutputStream stream = new ByteArrayOutputStream();  
  BerOutputStream out = new BerOutputStream(stream);
  headerNode.encode(out);
  byte[] bytes = stream.toByteArray();

   …………

   最终定稿:

   bouncycastle:

 /**
 * 话单记录
 * @author mizhao
 *
 */
public class BillingRecord extends DERSequence {

 /**
  * 计费号码
  */
 DERIA5String servedNum;

 /**
  * 用户类型
  */
 DERIA5String userType;

 /**
  * 呼叫类型记录类型
  */
 DERIA5String callingType;

 /**
  * 用户拨打号码方式
  */
 DERIA5String callingMeans;

 /**
  * 主叫号码
  */
 DERIA5String callingNum;

 /**
  * 被叫号码
  */
 DERIA5String calledNum;

 /**
  * 业务开始时间
  */
 DERIA5String callBeginTime;
 /**
  * 业务结束时间
  */
 DERIA5String callStopTime;

 /**
  * 使用时长
  */
 DERIA5String callDuration;

 /**
  * 创建圈子数量
  */
 DERInteger createCycleQuantity;

 /**
  * 圈子性质
  */
 DERIA5String cycleAttr;

 /**
  * SP代码
  */
 DERIA5String spCode;

 /**
  * 费用类型
  */
 DERIA5String chargeType;

 /**
  * 费用
  */
 DERInteger fee;

 /**
  * 优惠费用
  */
 DERInteger discount;
 
 public BillingRecord(String servedNum,String userType,String callingType,String callingMeans,String callingNum,String calledNum
   ,String callBeginTime,String callStopTime,String callDuration,int createCycleQuantity,String cycleAttr,String spCode
   ,String chargeType,int fee,int discount){
  super();
  this.servedNum = new DERIA5String(servedNum);
  this.userType = new DERIA5String(userType);
  this.callingType = new DERIA5String(callingType);
  this.callingMeans = new DERIA5String(callingMeans);
  this.callingNum = new DERIA5String(callingNum);
  this.calledNum = new DERIA5String(calledNum);
  this.callBeginTime = new DERIA5String(callBeginTime);
  this.callStopTime = new DERIA5String(callStopTime);
  this.callDuration = new DERIA5String(callDuration);
  this.createCycleQuantity = new DERInteger(createCycleQuantity);
  this.cycleAttr = new DERIA5String(cycleAttr);
  this.spCode = new DERIA5String(spCode);
  this.chargeType = new DERIA5String(chargeType);
  this.fee = new DERInteger(fee);
  this.discount = new DERInteger(discount);
  setUpElements();
 }
 
 public void setUpElements(){
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_SERVED_NUM,servedNum));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_USER_TYPE,userType));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_TYPE,callingType));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_MEANS,callingMeans));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_NUM,callingNum));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLED_NUM,calledNum));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_BEGIN_TIME,callBeginTime));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALL_STOP_TIME,callStopTime));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALL_STOP_TIME,callDuration));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CREATE_CYCLE_QUANTITY,createCycleQuantity));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CYCLE_ATTR,cycleAttr));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_SP_CODE,spCode));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CHARGE_TYPE,chargeType));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_FEE,fee));
  super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_DISCOUNT,discount));
 }

}

  

注:ASN1TagConstants中的常量可以自定义

测试方法:

public static BillingRecord createData(String servedNum,String userType,String callingType,String callingMeans,String callingNum,String calledNum
   ,String callBeginTime,String callStopTime,String callDuration,int createCycleQuantity,String cycleAttr,String spCode
   ,String chargeType,int fee,int discount){
  BillingRecord billingRecord = new BillingRecord(servedNum, userType, callingType, callingMeans, callingNum, calledNum, callBeginTime, callStopTime, callDuration, createCycleQuantity, cycleAttr, spCode, chargeType, fee, discount);
  return billingRecord;
 }

 

public static void main(String[] args) throws Exception {
    //数据信息(功能费)
  BillingRecord billingRecord = createData("13379035182","1","20","1","13379035182","1188913379035182","20100817142800","20100817142800","0",1,"1","10659181","2",5000,0);
  
 
//  ByteArrayOutputStream bOut = new ByteArrayOutputStream();
//  DEROutputStream dOut = new DEROutputStream(bOut);
//  dOut.writeObject(billingRecord );
//  byte[] bytes = bOut.toByteArray();

 }

 

 

 

分享到:
评论

相关推荐

    java解析ASN.1文件的实例和简要使用说明

    在实际开发中,了解和掌握这些内容对于高效地利用JAC进行ASN.1解析和编码至关重要。 总之,通过JAC,Java开发者可以轻松地处理ASN.1定义的数据,无论是在网络协议实现、数据交换还是其他需要结构化数据处理的场景中...

    ASN.1PER编码方式以及测试程序

    开发者可以利用这些信息来调试自己的ASN.1 PER编码实现,确保其在各种边界条件和异常情况下的正确性。 3. 关于代码实现: "test"可能是源代码文件或测试脚本,用于实现或验证ASN.1 PER编码。这个文件可能包含C、...

    ASN.1的具体内容文档

    在大规模系统开发中,利用JAVA等编程语言实现ASN.1编解码器,可以极大地简化通信协议的实现过程。通过ASN.1编译器,可以将ASN.1描述转换为JAVA的数据结构,再通过编解码器生成可传输的位模式,这一过程提高了系统的...

    基于Java实现的ASN.1 BER 和 DER 编码解码库.zip

    ASN.1(抽象语法标记一号)是一种在通信协议和数据表示中广泛使用的标准,它定义了一种数据结构化的方法,使得不同系统...理解ASN.1、BER和DER的概念,以及如何利用这样的库,对于提升软件的互操作性和安全性至关重要。

    JavaAsn1Compiler_2.0.rar

    这样,你可以利用Java的强大功能处理ASN.1定义的数据结构,同时保持与使用其他支持ASN.1的语言的系统兼容性。 3. **使用方法**:通过命令行接口,JavaAsn1Compiler接收asn.1文件作为输入,并生成对应的Java类。通常...

    使用语法工具辅助实现ASN.1的专利

    ASN.1语法工具是开发人员在处理ASN.1定义时的关键助手,它们可以帮助解析、编译和生成与ASN.1定义相关的代码。这些工具通常包括以下功能: 1. **解析器**:解析ASN.1规格,将其转换为内部数据结构,便于进一步处理...

    ASN.1编码规则详解(最全最经典)-(1).pdf

    ASN.1的源文件可以被预处理器映射成C、C++或Java等语言的数据结构,供应用程序代码使用,并可以利用支持的运行时库进行编码和解码操作。同时,ASN.1的描述还可以支持XML或TLV格式,以及更为紧凑的压缩编码格式。 ...

    asn1compiler:基于ANTLR的ASN1编译器生成Java类,Javascript对象等

    总结来说,asn1compiler是一个强大的工具,它利用ANTLR的强大功能,帮助开发者将ASN.1规格转换为可操作的编程语言代码,从而简化了处理ASN.1数据的复杂性,特别是在Java和JavaScript环境中。通过理解和使用asn1...

    java asn编译器

    2. **代码生成**:根据ASN.1规范,生成对应的Java源代码,这些代码包含了解析和编码ASN.1数据的类。 3. **编译支持**:将生成的Java源代码自动编译成可执行的.class文件。 4. **JAR打包**:将编译后的Java类打包成...

    asnrt_javase-3.14.15.zip_asn runtime_asnrt

    总之,这个"asnrt_javase-3.14.15.zip"压缩包提供了一个用于Java环境的ASN.1运行时库,开发者可以利用它来处理符合ASN.1标准的数据,从而在开发网络协议或其他需要高效二进制编码的系统时提升效率。

    asn1c-0.9.22

    asn1c的核心功能是将ASN.1定义的模式转换为C或C++语言的源代码,从而使得开发人员可以轻松地在他们的应用中进行数据编码和解码。 ASN.1是一种表示规则的语法,它定义了数据的结构和类型,如整数、字符串、序列、...

    使用OSS_tool解析OER编码

    本主题聚焦于“使用OSS_tool解析OER编码”,这涉及到ASN.1(Abstract Syntax Notation One)编码规范、JNI(Java Native Interface)以及如何通过这些技术实现跨平台的数据处理。 首先,ASN.1是一种国际标准,它...

    asn1:json解析器的asn1

    为了更好地利用这个asn1库,开发者需要熟悉ASN.1的基本概念,理解如何定义和操作ASN.1数据结构,同时掌握TypeScript的基本语法。通过学习和实践,可以将ASN.1的强大功能整合到TypeScript项目中,实现高效、安全的...

    GeoLite2/GeoIP 全球ASN-IP离线定位库 2022年最新版数据库 【mmdb】

    GeoLite2和GeoIP是MaxMind公司开发的两个著名数据库,用于IP地址到地理位置的映射,以及提供网络属性信息,如 Autonomous System Number (ASN)。ASN是互联网上用于识别和管理一组网络的唯一编号,它反映了网络的运营...

    org.bouncycastle完整资源包

    4. **asn.1编码解码**:ASN.1(抽象语法标记一号)是定义数据结构的标准,常用于证书和其他安全相关的数据。`org.bouncycastle`库提供了asn.1编码和解码器,方便处理这些数据。 5. **随机数生成器**:库中包含高...

    GeoLite2/ GeoIP 全球国家IP定位离线库 2020.06.30 最新版 (内含mmdb)

    GeoLite2是由MaxMind公司开发的一个免费版本,它提供了与商业GeoIP2数据库相似的功能,但可能更新频率较低,数据精度稍有差距。GeoLite2数据库采用了二进制的mmdb格式,这种格式高效且易于解析,适用于多种编程语言...

    四阶段第1天资料.zip

    在本压缩包“四阶段第1天资料.zip”中,我们聚焦于Java编程语言的第四阶段学习内容,这个阶段通常涵盖了高级特性和实际项目开发的关键技能。描述提及了“项目开发”和“测试五家信息内容”,这暗示我们将探讨如何在...

    java-snmp_1.4.orig.tar.gz_MIB java_SNMP_java-snmp-1.4.2.jar _mib

    MIB文件通常使用ASN.1(Abstract Syntax Notation One)语法编写,可以被SNMP代理(agent)理解和执行。`java_SNMP_java-snmp-1.4.2.jar`可能是一个包含Java SNMP库的可执行JAR文件,便于开发者在Java环境中使用SNMP...

Global site tag (gtag.js) - Google Analytics