简单的来说,通俗理解:
比如数据0x12345678
大端:地址由低到高,先放数据的高位,就是0x12,0x34,0x56,0x78;
小端:地址由低到高,先放数据的低位,就是0x78,0x56,0x34,0x12;
继续阅读 »
对大端小端的研究
最简单的TCP网络封包解包
TCP为什么需要进行封包解包?
TCP采用字节流的方式,即以字节为单位传输字节序列。那么,我们recv到的就是一串毫无规则的字节流。如果要让这无规则的字节流有规则,那么,就需要我们去定义一个规则。那便是所谓的“封包规则”。
封包结构是怎么样的?
封包就像是信,信是由:信封、信内容。两部分组成。而网络封包也是由两部分组成:包头、数据。包头域是定长的,数据域是不定长的。包头必然包含两个信息:操作码、包长度。包头可能还包含别的信息,这个呢就要视乎情况去定了。操作码是该网络数据包的标识符,这就和UI里面的事件ID什么的差不多。其中,操作码有的只有一级,有的则有两级甚至多级操作码,这个的设计也要看情况去了,不过,这些底层的东西,定好了,基本就不能动了,就像房子都砌起来了,再去动地基,那就欧也了。 继续阅读 »
c++ 动态判断基类指针指向的子类类型(typeid)
我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Base * pf; Derived s1; pf = &s1; //cout << typeid(*pf).name() << endl; if (strcmp(typeid(Derived).name(), typeid(*pf).name()) == 0) { cout << "this is Derived class"; } else { cout << "not is Derived class"; } |
CryptoPP使用介绍
Crypto++是个免费的C++加解密类库,由于资格太老、持续更新,最新版本到了CryptoPP 5.6,对天缘而言,第一眼看到CryptoPP就感觉头大,根目录下放置大量单源文件、编译文件、项目文件,再加上多平台和多编译器支持,文件几乎又多了一倍,而且还是都混到一起,直接就让人望而却步。毕竟Crypto是个功能完整,且经过大量用户使用考验的开源库。所以,皱眉学习汇总一下,遂成此文。
本文测试环境:Windows7 SP1+VC6,测试工程名为Test。用VC打开CryptoPP工程文件,会发现有四个子工程:
- cryptdll – 生成cryptopp.dll动态库
- dlltest – 用来测试cryptopp.dll,依赖cryptdll工程
- cryptlib – 生成cryptlib.lib静态库
- cryptest – 用来测试cryptopp,依赖cryptlib工程
所以,我们有两种使用CryptoPP方法,一种是静态链接,还有一种是动态链接,使用对应的工程编译即可,区别就不说了,我们下文以静态链接为例,介绍几种常用加解密算法使用。
一、编译cryptlib
首先需要编译cryptlib,最后得到cryptlib.lib文件。
继续阅读 »
ar 打包库到另外一个库中
ar语法:
1 |
ar [-] [必要参数] [可选参数] [成员文件] |
ar 命令:将多个文件打包到一个文件中,也可以从打包的文件中提取文件,且打包的文件保留原来的属性
必要参数
1 2 3 4 5 6 7 |
-d 删除打包文件中的成员文件 -m 变更成员文件在打包文件中的次序 -p 显示打包文件中的成员文件内容 -q 将问家附加在打包文件末端 -r 将文件插入打包文件中 -t 显示打包文件中所包含的文件 -x 从打包文件中提取文件 |
选择参数
1 2 3 4 5 6 7 8 9 10 11 |
a<成员文件> 将文件插入打包文件中指定的成员文件之后 b<成员文件> 将文件插入打包文件中指定的成员文件之前 c 建立打包文件 f 保持其他系统ar命令兼容,截掉过长的文件名 i<成员文件> 与“b” 参数作用相同 o 保留打包文件的文件信息 s 创建档案文件的符号表 S 不创建档案文件的符号表 u 与“r”一起使用,替换打包文件中已经修改的文件 v 显示详细的处理信息。 V 显示版本信息 |
sizeof的32位和64位兼容问题
编译安装GCC 5.2.0
记录编译GCC 5.2.0时遇到的问题和解决方法,以备日后查询。
平时使用的服务器是CentOS5,自带的gcc编译器还是8年前发布的4.1.2版本,完全没法写C++11的代码,因为不想升级操作系统,只好自己下载源码编译。
安装过程挺dan疼的,只好记录下来。
安装依赖库
GCC依赖于gmp 4.2+, mpfr 2.4+和mpc 0.8+,这里直接下载安装最新的版本。
继续阅读 »
pthread_barrier_init,pthread_barrier_wait简介
pthread_barrier 系列函数在<pthread.h>中定义,用于多线程的同步,它包含三个函数:
–pthread_barrier_init()
–pthread_barrier_wait()
–pthread_barrier_destroy()
那么pthread_barrier_*是用来做什么的?这三个函数又怎么配合使用呢?
pthread_barrier_*其实只做且只能做一件事,就是充当栏杆(barrier意为栏杆)。形象的说就是把先后到达的多个线程挡在同一栏杆前,直到所有线程到齐,然后撤下栏杆同时放行。1)init函数负责指定要等待的线程个数;2) wait()函数由每个线程主动调用,它告诉栏杆“我到起跑线前了”。wait()执行末尾栏杆会检查是否所有人都到栏杆前了,如果是,栏杆就消失所有线程继续执行下一句代码;如果不是,则所有已到wait()的线程停在该函数不动,剩下没执行到wait()的线程继续执行;3)destroy函数释放init申请的资源。
继续阅读 »
在Linux下实现COM组件
COM组件是一种编程规范,它规定了软件编程的一般方法,虽然它由Microsoft公司制定和提出,但是它的规则也可以在Linux下使用,下面是在Linux下实现COM组件的方法。
—-参考《COM技术内幕》一书。
COM实现的技术,主要是C++的虚函数、多继承以及动态链接库(DLL)技术。
继续阅读 »
近期评论