CN105786529A - 一种类托管代码调用c/c++风格函数的复杂结构的参数设计方法 - Google Patents
一种类托管代码调用c/c++风格函数的复杂结构的参数设计方法 Download PDFInfo
- Publication number
- CN105786529A CN105786529A CN201610257469.2A CN201610257469A CN105786529A CN 105786529 A CN105786529 A CN 105786529A CN 201610257469 A CN201610257469 A CN 201610257469A CN 105786529 A CN105786529 A CN 105786529A
- Authority
- CN
- China
- Prior art keywords
- character string
- json
- calling
- character
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,1)在调用端中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;2)取出字符串中的字符组成数组,末尾以“\0”作结束;3)传入接口函数;4)在被调用端将字符数组转成字符串;5)建立JSON字符串解析模块,生成对应的调用端的自定义的结构变量;6)向被调用端输出信息时,将输出信息生成JSON字符串;7)取出字符串中的字符组成数组,末尾以“\0”作结束;8)将数组地址赋值给输出参数指针。本发明提供了一种简化接口复杂度、代码维护优良的类托管代码调用C/C++风格函数的复杂结构的参数设计方法。
Description
技术领域
本发明属于托管代码领域,涉及一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法。
背景技术
所谓托管代码是微软的术语,源于.NET专业程序开发平台,例如C#就是这样一种软件开发语言,其基于CLR(commonlanguageruntime)库运行程序;JAVA也是类似托管的一种开发语言平台,其基于JVM(JavaVirtualMachine)虚拟机运行程序。托管语言开发的程序有自动内存垃圾回收机制,运行速度相对比C/C++程序慢,但开发速度快,运行时较安全可靠。在C#/JAVA开发中常常需要调用C/C++实现的函数库,这样托管代码的优势和C/C++语言的优势可以无缝结合了。C#调用C/C++函数使用的方法称为P/Invoke,而JAVA采用JNI方法调用C/C++函数。
C#/JAVA和C/C++之间的基本数据类型有着显著的差异,而且C/C++具有灵活的自定义结构;C#也有自定义的结构类型,但和C/C++显然不一样,JAVA是使用类来定义结构的,但JAVA的类的形式和C++的类是不一样的。所有这些差异导致在C#/JAVA调用C/C++函数时常常使用与C#/JAVA内置的基本数据类型一致的数据规格,例如使用整型、浮点型变量。如果C/C++的函数参数是字符型,那么一定要使用宽字符,因为C#中的char型默认是双字节的。
C/C++、C#、和JAVA数据类型的不完全比较(表格中数字表示字节数),参照表1:
表1
表1显示了各开发语言在基本数据类型的字节长度的差异,尤其虽然各自有自定义的数据结构的功能,但结构在形式上是不一样的。
通过上面的分析,我们知道在C/C++中实现复杂的数据结构的输入输出时,这样的函数很难直接被C#/JAVA调用,必须要将参数转化为仅仅使用基本类型的形式,但这样的设计往往增加了接口函数的数目、复杂度,不利于对代码作优良的维护,以及对数据设计概念的传递和保持。
发明内容
为了克服已有C/C++中实现复杂的数据结构的输入输出时很难直接被C#/JAVA调用的不足,本发明提供了一种简化接口复杂度、代码维护优良的类托管代码调用C/C++风格函数的复杂结构的参数设计方法。
本发明解决其技术问题所采用的技术方案是:
一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,C/C++端作为被调用端,C#/Java端作为调用端,所述参数设计方法包括如下步骤:
1)在调用端中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;
2)取出字符串中的字符组成数组,末尾以“\0”作结束;
3)传入接口函数;
4)在被调用端将字符数组转成字符串;
5)建立JSON字符串解析模块,生成对应的调用端的自定义的结构变量;
6)向被调用端输出信息时,将输出信息生成JSON字符串;
7)取出字符串中的字符组成数组,末尾以“\0”作结束;
8)将数组地址赋值给输出参数指针。
进一步,所述步骤1)中在结构变量转成JSON消息时,以及所述步骤5)中JSON消息解析生成C#/JAVA的自定义结构变量时;结构变量中每一个分量的变量名作“名称”,分量的取值作值;如果分量类型也是一个子结构,那么对该结构预先作好“名称/值”配对的集合,然后将该子结构变量定义为一个新的名称,该子结构的“名称/值”对集合就是它的值。
本发明的技术构思为:基于宽字符数组开发了一套适用于任意复杂度结构的参数形式化设计方法,而且支持在C/C++和C#/JAVA之间无缝传递。
依赖于JSON这种数据交换的格式协议。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。JSON建构于两种结构:“名称/值”对的集合、值的有序列表。“名称/值”之间使用“:”分离,值之间使用“,”分离。
本发明的有益效果主要表现在:简化接口复杂度、代码可维护性较好。
附图说明
图1是支持任意复杂结构的JSON化参数设计原理图。
具体实施方式
下面结合附图对本发明作进一步描述。
参照图1,一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,C/C++端作为被调用端,C#/Java端作为调用端,所述参数设计方法包括如下步骤:
1)在调用端中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;
2)取出字符串中的字符组成数组,末尾以“\0”作结束;
3)传入接口函数;
4)在被调用端将字符数组转成字符串;
5)建立JSON字符串解析模块,生成对应的调用端的自定义的结构变量;
6)向被调用端输出信息时,将输出信息生成JSON字符串;
7)取出字符串中的字符组成数组,末尾以“\0”作结束;
8)将数组地址赋值给输出参数指针。
本实施例中,调用端需要给被调用端输入信息,被调用端需要输出一些信息给调用端。
本实施例中,在C/C++中的接口函数原型为
VoidInterfaceFunc(wchar*in_message,intinlen,wchar*out_message,intoutlen);
而在C#/JAVA的接口设计为
VoidInterfaceFunc(char*in_message,intinlen,char*out_message,intoutlen);
即使用JAVA/C#的双字节Char型和C/C++中的宽字符wchar对接,inlen/outlen是输入输出字符串的长度(字符的数目),字符数据取自于字符串,末尾为“\0”作结束。
实现步骤,以实现输入参数为例:
1)在C#/Java中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;
2)取出字符串中的字符组成数组,末尾以“\0”作结束;
3)传入接口函数;
4)在C/C++端将字符数组转成字符串;
5)建立JSON字符串解析模块,生成对应的C#/JAVA的自定义的结构变量。
6)向C#/JAVA端输出信息时,将输出信息生成JSON字符串;
7)取出字符串中的字符组成数组,末尾以“\0”作结束;
8)将数组地址赋值给输出参数指针。
在结构变量转成JSON消息时,结构变量中每一个分量的变量名作“名称”,分量的取值作值;如果分量类型也是一个子结构,那么对该结构预先作好“名称/值”配对的集合,然后将该子结构变量定义为一个新的名称,该子结构的“名称/值”对集合就是它的值。在JSON消息解析生成C#/JAVA的自定义结构变量时对结构内嵌的子结构作相应的处理。
对于参数输出的情况类似,只是在C/C++端进行JSON消息的生成,而在C#/JAVA端实现对JSON消息的解析。
实例:对一条数字地图的路径的数据结构的模拟,
在C/C++中的表示:
在C#/JAVA端解析JSON消息包时自然可以通过through_address的取值数目知道路径途径点的数目。
Claims (2)
1.一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,其特征在于:C/C++端作为被调用端,C#/Java端作为调用端,所述参数设计方法包括如下步骤:
1)在调用端中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;
2)取出字符串中的字符组成数组,末尾以“\0”作结束;
3)传入接口函数;
4)在被调用端将字符数组转成字符串;
5)建立JSON字符串解析模块,生成对应的调用端的自定义的结构变量;
6)向被调用端输出信息时,将输出信息生成JSON字符串;
7)取出字符串中的字符组成数组,末尾以“\0”作结束;
8)将数组地址赋值给输出参数指针。
2.如权利要求1所述的一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,其特征在于:所述步骤1)中在结构变量转成JSON消息时,以及所述步骤5)中JSON消息解析生成C#/JAVA的自定义结构变量时;结构变量中每一个分量的变量名作“名称”,分量的取值作值;如果分量类型也是一个子结构,那么对该结构预先作好“名称/值”配对的集合,然后将该子结构变量定义为一个新的名称,该子结构的“名称/值”对集合就是它的值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610257469.2A CN105786529B (zh) | 2016-04-22 | 2016-04-22 | 一种类托管代码调用c/c++风格函数的复杂结构的参数设计方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610257469.2A CN105786529B (zh) | 2016-04-22 | 2016-04-22 | 一种类托管代码调用c/c++风格函数的复杂结构的参数设计方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105786529A true CN105786529A (zh) | 2016-07-20 |
CN105786529B CN105786529B (zh) | 2018-11-20 |
Family
ID=56398394
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610257469.2A Active CN105786529B (zh) | 2016-04-22 | 2016-04-22 | 一种类托管代码调用c/c++风格函数的复杂结构的参数设计方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105786529B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111045685A (zh) * | 2019-11-05 | 2020-04-21 | 贝壳技术有限公司 | 代码转换方法、装置、存储介质及电子设备 |
CN111752566A (zh) * | 2019-03-28 | 2020-10-09 | 上海视九信息科技有限公司 | 编译型语言环境中函数表达式的解析方法及装置、存储介质、终端 |
CN112214212A (zh) * | 2020-10-10 | 2021-01-12 | 江西洪都航空工业集团有限责任公司 | 一种根据json格式数据生成c#语言源代码的方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020169896A1 (en) * | 2001-05-09 | 2002-11-14 | Stepan Sokolov | Frameworks for efficient representation of string objects in Java programming environments |
CN1519716A (zh) * | 2003-01-22 | 2004-08-11 | 北京科泰世纪科技有限公司 | 基于构件定义语言自动生成c++程序的方法 |
CN103399934A (zh) * | 2013-08-09 | 2013-11-20 | 神州数码(中国)有限公司 | 一种表单数据的传输与存储方法 |
CN105279033A (zh) * | 2014-07-22 | 2016-01-27 | Tcl集团股份有限公司 | Android平台下C++和Java通信的方法及系统 |
-
2016
- 2016-04-22 CN CN201610257469.2A patent/CN105786529B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020169896A1 (en) * | 2001-05-09 | 2002-11-14 | Stepan Sokolov | Frameworks for efficient representation of string objects in Java programming environments |
CN1519716A (zh) * | 2003-01-22 | 2004-08-11 | 北京科泰世纪科技有限公司 | 基于构件定义语言自动生成c++程序的方法 |
CN103399934A (zh) * | 2013-08-09 | 2013-11-20 | 神州数码(中国)有限公司 | 一种表单数据的传输与存储方法 |
CN105279033A (zh) * | 2014-07-22 | 2016-01-27 | Tcl集团股份有限公司 | Android平台下C++和Java通信的方法及系统 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111752566A (zh) * | 2019-03-28 | 2020-10-09 | 上海视九信息科技有限公司 | 编译型语言环境中函数表达式的解析方法及装置、存储介质、终端 |
CN111752566B (zh) * | 2019-03-28 | 2024-03-22 | 上海视九信息科技有限公司 | 编译型语言环境中函数表达式的解析方法及装置、存储介质、终端 |
CN111045685A (zh) * | 2019-11-05 | 2020-04-21 | 贝壳技术有限公司 | 代码转换方法、装置、存储介质及电子设备 |
CN112214212A (zh) * | 2020-10-10 | 2021-01-12 | 江西洪都航空工业集团有限责任公司 | 一种根据json格式数据生成c#语言源代码的方法 |
CN112214212B (zh) * | 2020-10-10 | 2024-04-02 | 江西洪都航空工业集团有限责任公司 | 一种根据json格式数据生成c#语言源代码的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105786529B (zh) | 2018-11-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106970820A (zh) | 代码存储方法及代码存储装置 | |
CN106293664A (zh) | 代码生成方法及装置 | |
CN105511843A (zh) | 一种生成应用程序界面的方法和装置 | |
CN104750472B (zh) | 一种终端应用的资源包管理方法和装置 | |
US11675744B2 (en) | Performing a code conversion in a smaller target encoding space | |
CN105426394A (zh) | 基于跨平台的移动报表生成方法和系统 | |
CN101673199A (zh) | 终端参数配置服务器及其软件界面的自动生成方法 | |
CN104881469A (zh) | 一种数据导出方法和装置 | |
CN105786529A (zh) | 一种类托管代码调用c/c++风格函数的复杂结构的参数设计方法 | |
CN110297636A (zh) | 一种基于页面配置文件的页面自动生成和参数管理方法、系统和装置 | |
CN110413574A (zh) | 一种自动生成代码国际化资源的方法 | |
CN107450993A (zh) | 一种分布式iec61850通信组件的数据交互方法 | |
CN113641700A (zh) | 一种基于Spring boot框架的数据处理方法及装置 | |
CN107292136A (zh) | 一种基于微服务的pdf文件防伪水印嵌入方法及系统 | |
CN107301067A (zh) | 基于iap技术的北斗用户机远程升级系统及其升级方法 | |
CN103970776A (zh) | 一种创建can分层树的方法和系统 | |
CN108153745B (zh) | 一种应用数据调用方法及应用开发系统 | |
CN103593188A (zh) | 一种用于仪器所见即所得菜单的管理系统及管理方法 | |
CN106293658A (zh) | 一种界面组件生成方法及其设备 | |
CN102609253B (zh) | 一种智能卡的应用实现方法及系统 | |
CN111782882A (zh) | 一种tcp报文转换方法、装置、系统及计算机存储介质 | |
CN105793842B (zh) | 序列化消息之间的转换方法和装置 | |
CN105279032B (zh) | 一种同步接口报文与javaBean的方法及装置 | |
CN104378362A (zh) | 用于进行报文接口转换的方法及装置 | |
CN109086326B (zh) | 一种将接口文档转化成数据模型文件的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20220128 Address after: 310000 5-1006, No. 501, No. 2 street, Baiyang street, Qiantang new area, Hangzhou, Zhejiang Province Patentee after: Hangzhou Markov Technology Co.,Ltd. Address before: The city Zhaohui six districts Chao Wang Road Hangzhou City, Zhejiang province 310014 18 Patentee before: ZHEJIANG University OF TECHNOLOGY |
|
TR01 | Transfer of patent right |