内容简介:1.背景前几天用2.开搞C++
1.背景
前几天用 Python在 Linux 下成功的获取了二代证数据 ,最近正在学 Go 语言,这两天想着用Go语言也实现一下试看看。
2.开搞C++
这次就比较简单了,直接把CppDemo里面的SynReader.h拿来就可以,还有就是把CppDemo里面的lib文件也复制过来就可以,
具体流程和 Python 那篇文章的一样
被我精简后的SynReader.h
1 #ifndef SYN_READER_H
2 #define SYN_READER_H
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8
9
10 #pragma pack(1)
11
12 typedef struct IDCardDataUTF8 {
13 char CardType[10]; //I为外国人居住证,J 为港澳台居住证,空格(0x20)为普通身份证
14 char Name[40]; //姓名
15 char EngName[130]; //英文名(外国人居住证)
16 char Sex[10]; //性别
17 char Nation[100]; //民族或国籍(外国人居住证)
18 char Birthday[18]; //出生日期
19 char Address[80]; //住址
20 char IDCardNo[40]; //身份证号或外国人居住证号(外国人居住证)
21 char GrantDept[40]; //发证机关
22 char UserLifeBegin[30]; //有效开始日期
23 char UserLifeEnd[30]; //有效截止日期
24 char PassID[30]; //通行证号码(港澳台)
25 char IssuesTimes[10]; //签发次数(港澳台)
26 char CertVol[10]; //证件版本号(外国人居住证)
27 char wlt[1024]; //照片数据
28 int isSavePhotoOK; //照片是否解码保存 0=no 1=yes
29 char fp[1024]; //指纹数据
30 int isFpRead; //是否读取了证内指纹 0=no 1=yes
31 } St_IDCardDataUTF8, *PSt_IDCardDataUTF8;
32 #pragma pack()
33
34 //读身份证文字和照片信息
35 int getIDcard(St_IDCardDataUTF8 *pIDCardDataUTF8);
36
37 int OpenUsbComm();
38 int OpenSerialComm(const char*);
39 int CloseComm();
40
41
42 //解码照片函数,wltBuffer原始照片1024字节wlt数据,bmpPath 保存照片位置
43 int saveWlt2Bmp( char* wltBuffer,const char* bmpPath);
44 int saveWlt2BmpUseFork( char* wltBuffer,const char* bmpPath);
45
46 //获取动态库版本
47 const char* getLibVersion();
48 int getLibVersionInt();
49
50
51
52 #ifdef __cplusplus
53 }
54 #endif
55
56 #endif
3.开搞Go
直接上代码了,大概的分析和Python的差不多,在Go语言中,主要是用到import "C"这个东东来调用 C语言 里面的函数
main.go
1 package main
2
3 /*
4 #cgo LDFLAGS: -L ./lib -lSynReader64
5 #include "../include/SynReader64.h"
6 */
7 import "C"
8 import (
9 "fmt"
10 "unsafe"
11 )
12
13 /*
14 CArrayToGoString 将C语言中的字符数组转为Go语言的string
15 */
16 func CArrayToGoString(cArray unsafe.Pointer, size int) (goStr string) {
17 p := uintptr(cArray)
18 var goArray []byte
19 for i := 0; i < size; i++ {
20 j := *(*byte)(unsafe.Pointer(p))
21 goArray = append(goArray, j)
22 p += unsafe.Sizeof(j)
23 }
24
25 return string(goArray)
26 }
27
28 func main() {
29
30 var stIDCardDataUTF8 C.struct_IDCardDataUTF8
31
32 openState := C.OpenUsbComm()
33
34 if openState == 0 {
35 getState := C.getIDcard(&stIDCardDataUTF8)
36
37 if getState == 0 {
38 strName := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Name), 40)
39 strSex := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Sex), 10)
40 strNation := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Nation), 100)
41 strBirthday := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Birthday), 18)
42 strAddress := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Address), 80)
43 strIDCardNo := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.IDCardNo), 40)
44 strGrantDept := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.GrantDept), 40)
45 strUserLifeBegin := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.UserLifeBegin), 30)
46 strUserLifeEnd := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.UserLifeEnd), 30)
47
48 fmt.Println(strName)
49 fmt.Println(strSex)
50 fmt.Println(strNation)
51 fmt.Println(strBirthday)
52 fmt.Println(strAddress)
53 fmt.Println(strIDCardNo)
54 fmt.Println(strGrantDept)
55 fmt.Println(strUserLifeBegin)
56 fmt.Println(strUserLifeEnd)
57
58 photoData := unsafe.Pointer(&stIDCardDataUTF8.wlt)
59 C.saveWlt2BmpUseFork((*C.char)(photoData), C.CString("Photo.bmp"))
60 }
61
62 }
63 C.CloseComm()
64
65 }
其中注意,第4行,作用是引入so库,-l参数后面加so文件名(不含.so)
第5行是引入C++定义的头文件
具体路径目录如下:
├── include
│ └── SynReader64.h
├── libx64
│ ├── libSynReader64.so
│ ├── libusb-1.0.so
│ └── libwlt.so
└── src
├── main
└── main.go
4.结束
接着想实现用Python或者Go语言作为http服务器,将该刷卡服务以http方式返回json信息,这样就可以实现不使用浏览器插件,以及跨浏览器刷卡。敬请期待......
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 直观讲解-RPC调用和HTTP调用的区别
- 调用链系列一:解读UAVStack中的调用链技术
- 调用链系列二:解读UAVStack中的调用链技术
- 调用链系列三:解读UAVStack中的调用链技术
- dubbo源码解析(二十七)远程调用——injvm本地调用
- 微服务间的调用和应用内调用有什么区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java并发编程实战
Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes、Doug Lea / 童云兰 / 机械工业出版社华章公司 / 2012-2 / 69.00元
本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性......一起来看看 《Java并发编程实战》 这本书的介绍吧!