开源精神

开源精神的本质是在共享中创新,具有开放、协作、互助、互利、透明和共同创造的哲学观点。

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。

ASCII编码

参考资料:https://zh.wikipedia.org/wiki/ASCII

ASCII编码是美国信息交换标准代码的缩写,是一种基于拉丁字母的编码方式。它定义了128个字符,包括数字、字母、标点符号和一些控制字符。由于只有128个字符,存储效率和传输效率比较高,但是只能表示英文字符,不能表示汉字等其他语言的字符。

ASCII控制字符的编号范围是0-31和127(16进制:0x00-0x1F和0x7F),共33个字符。

可显示字符编号范围是32-126(0x20-0x7E),共95个字符。

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00–0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。

也就是说,ANSI码仅在前128(0-127)个与ASCII码相同,之后的字符全是某个国家语言的所有字符。

两个字节最多可以存储的字符数目是2的16次方,即65536个字符,大家认为这对于一个语言的字符来说,绝对够了。

ANSI编码其实包括很多编码:中国制定了GB2312编码,用来把中文编进去另外,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准。受制于当时的条件,不同语言之间的ANSI码之间不能互相转换,这就会导致在多语言混合的文本中会有乱码。

Unicode字符集

unicode官网:https://home.unicode.org/
UTF-8官网:https://www.utf8.com/

为了解决不同国家ANSI编码的冲突问题,Unicode应运而生:如果全世界每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。

Unicode 是一套字符集,而不是一套字符编码

任何文字在Unicode中都对应一个值, 这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。 而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。 顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。

为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。 它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。

Unicode字符集支持三种字符编码方式:UTF-32,UTF-16,和UTF-8。

UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。

UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;

UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;

UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。

最好用的是UTF-8编码,只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码。

完整的 Unicode 字符集,以及各种编码方式:在这里:https://unicode-table.com/cn/

UTF存储大小端的问题:

BOM即Byte Order Mark字节序标记。BOM是为UTF-16和UTF-32准备的,用户标记字节序(byte order)。拿UTF-16来举例,其是以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流"594E",那么这是“奎”还是“乙”?

小端字节序简写为 LE( Little-Endian ), 表示低位字节在前,高位字节在后, 高位字节保存在内存的高地址端,而低位字节保存在内存的低地址端

大端字节序简写为 BE( Big-Endian ), 表示 高位字节在前,低位字节在后,高位字节保存在内存的低地址端,低位字节保存在在内存的高地址端

Unicode规范中推荐的标记字节顺序的方法是BOM:在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"(零宽度无间断空间)的字符,它的编码是FEFF。而FEFF在UCS中是不不能再的字符(即不可见),所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者接收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称为BOM。?

UTF-8是以字节为编码单元,没有字节序的问题。UTF-8 BOM又叫UTF-8 签名,UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。当文本程序读取到以 EF BB BF开头的字节流时,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。

BASE64

参考资料:https://en.wikipedia.org/wiki/Base64)
实现代码参考:https://github.com/weidai11/cryptopp

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换字符数据;然而直接转换是不行的,因为网络传输只能传输可打印字符;什么是可打印字符?在ASCII码中规定,0-31、127这33个字符属于控制字符,32-126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其它字符呢?其中一种方式就是使用Base64.

由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。

base64特别适合在http,mime协议下快速传输数据。base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。

其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

libiconv

参考资料:https://www.gnu.org/software/libiconv/
需要的话参考自行编译:https://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio

开源的、跨平台的字符集转换库。可以在Linux系统上使用,也支持Windows等其他操作系统。

International text is mostly encoded in Unicode. For historical reasons, however, it is sometimes still encoded using a language or country dependent character encoding. With the advent of the internet and the frequent exchange of text across countries - even the viewing of a web page from a foreign country is a "text exchange" in this context -, conversions between these encodings have become a necessity.

15种常用加密解密算法:
散列哈希:MD5、SHA、CRC32
对称加密算法:DES(淘汰),3DES(又称TDEA或Triple DES)(淘汰),AES(用于替代 DES,是目前常用的,又称Rijndael加密),Blowfish,RC系列,IDEA,SKIPJACK等
非对称加密算法:RSA、DSA、ECC、DH等
DES 现在认为是一种不安全的加密算法,已经有用穷举法攻破 DES 密码的报道了。3DES 是 DES 的加强版本(也被淘汰),是 DES 向 AES 过渡的加密算法。

MD5

参考资料:https://en.wikipedia.org/wiki/MD5
实现代码参考:https://github.com/weidai11/cryptopp

MD5密码是一种数字摘要算法,它可以将任意长度的字符串转换成一个128位的散列值,也就是一个16字节的数字。MD5算法的发明者是罗纳德·李维斯特(RonaldL.Rivest),MD5的全称是“消息摘要算法第五版”,它是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。

MD5主要应用场景:

数据完整性校验:MD5可以对数据进行哈希计算,生成唯一的哈希值,这个哈希值可以用来校验数据的完整性。如果数据被篡改了,那么它的哈希值也会发生变化,这样就可以发现数据的篡改。

密码安全:MD5可以对密码进行哈希计算,生成唯一的哈希值,这个哈希值可以用来存储密码。由于哈希值是不可逆的,攻击者即使获取了哈希值也无法直接得到原始密码,从而提高了密码的安全性。

数字签名:MD5可以用来生成数字签名,数字签名是一种用来保证数据完整性和身份认证的技术。数字签名是由数据的哈希值和数字证书中的签名者信息组成的

总的来说,MD5主要用于数据完整性校验、密码安全和数字签名等方面,是一种非常重要的哈希算法。但是需要注意的是,由于MD5算法存在一些安全漏洞,因此现在已经不推荐使用MD5算法了,更安全的哈希算法包括SHA-256、SHA-512等。

SHA算法

参考资料:https://en.wikipedia.org/wiki/SHA-1
参考资料:https://en.wikipedia.org/wiki/SHA-2
参考资料:https://en.wikipedia.org/wiki/SHA-3
实现代码参考:https://github.com/weidai11/cryptopp

SHA算法(Secure Hash Algorithm),⼜叫安全散列算法。SHA算法是基于MD4算法的基础上演变而来。但SHA算法出身好,是美国国家安全局设计的。

SHA算法,是一个系列家族,包括SHA-1,SHA-2(SHA-224、SHA-256、SHA-384、SHA-512),括号中的四个通常被统称为SHA-2。

SHA-1的最终密码长度是160位。SHA-256的最终密码长度是256位。SHA-384的最终密码长度是384位。SHA-512的最终密码长度是512位。SHA算法,实际上也是一种消息摘要算法,这个和MD算法是类似的。

主要用途:数字签名、数字时间戳、数字证书

AES算法

参考资料:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
实现代码参考:https://github.com/weidai11/cryptopp

AES算法全称Advanced Encryption Standard,又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES支持三种长度的密钥:128位,192位,256位。

RSA

参考资料:https://en.wikipedia.org/wiki/RSA_(cryptosystem)
实现代码参考:https://github.com/weidai11/cryptopp

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

主要用途:

网络通信安全

RSA算法可以用于保护网络通信的安全,比如HTTPS、SSH等协议都使用了RSA算法来加密通信过程中的数据。

数字签名

RSA算法可以用于数字签名,保证数据的完整性和真实性,比如在电子商务中,商家可以使用RSA算法对订单进行数字签名,确保订单的真实性和完整性。

身份认证

RSA算法可以用于身份认证,比如在网银等场景中,用户可以使用RSA算法生成一对公私钥,将公钥发送给银行,银行使用公钥对数据进行加密,只有用户拥有私钥才能解密,从而实现身份认证。

数据加密

RSA算法可以用于对数据进行加密,确保数据的安全性,比如在云计算、移动设备等场景中,RSA算法可以对敏感数据进行加密,防止数据泄露。

在Windows下压缩格式有很多种,常见的有如下关系:
zip:不同于gzip,虽然使用相似的算法,可以打包压缩多个文件,不过分别压缩文件,压缩率低于tar
rar:Windows 环境下用的比较多的压缩,比较著名的GUI工具是winrar
tar: Linux系统下的打包工具,只打包,不压缩
gz:即gzip,通常只能压缩一个文件。与tar结合起来就可以实现先打包,再压缩。
tgz:即gz。先用tar打包,然后再用gz压缩得到的文件
7z:7zip压缩软件支持的格式,压缩效率较高。LZMA :7z格式默认和通用的压缩方法。

zlib

官网:https://www.zlib.net/
源代码:https://github.com/madler/zlib

zlib是一套通用的解压缩开源库,提供了内存(in-memory)压缩和解压函数,能检测解压出来的数据完整性,zlib 也支持读写 gzip (.gz) 格式的文件.

ZipArchive

官网:http://www.artpol-software.com/
源代码:https://github.com/ZipArchive/ZipArchive

This library adds ZIP compression functionality to your software.

ini解析库

源代码:https://github.com/compuphase/minIni

Libconfig is a simple library for processing structured configuration files, like this one. This file format is more compact and more readable than XML. And unlike XML, it is type-aware, so it is not necessary to do string parsing in application code.

Libconfig

官网:https://hyperrealm.github.io/libconfig/
源代码:https://github.com/hyperrealm/libconfig

Libconfig is a simple library for processing structured configuration files, like this one. This file format is more compact and more readable than XML. And unlike XML, it is type-aware, so it is not necessary to do string parsing in application code.

XML解析库:TinyXML2

源代码:https://github.com/leethomason/tinyxml2

TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.

XML解析库:RapidXML

官网:https://rapidxml.sourceforge.net/

RapidXml is an attempt to create the fastest XML parser possible, while retaining useability, portability and reasonable W3C compatibility. It is an in-situ parser written in modern C++, with parsing speed approaching that of strlen function executed on the same data.

XML解析库:Xerces-C++

官网:https://xerces.apache.org/xerces-c/
源代码:https://downloads.apache.org/xerces/c/3/sources/

Xerces-C++ is a validating XML parser written in a portable subset of C++. Xerces-C++ makes it easy to give your application the ability to read and write XML data. A shared library is provided for parsing, generating, manipulating, and validating XML documents using the DOM, SAX, and SAX2 APIs.

XML解析库:PugiXML

官网:https://pugixml.org/
源代码:https://github.com/zeux/pugixml

pugixml is a light-weight C++ XML processing library.

libpng

官网:http://www.libpng.org/pub/png/libpng.html
源代码:https://libpng.sourceforge.io/index.html

libpng 是一套免费的、公开源代码的程序库,支持对 PNG 图形文件的创建、读写等操作。

FreeImage

官网:https://freeimage.sourceforge.io/
源代码:https://freeimage.sourceforge.io/download.html

freeimage是一款免费的、开源的、跨平台(Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。

stb_image

源代码:https://github.com/nothings/stb

stb_image.h 是 Sean Barrett 的一个非常流行的单头文件图像加载库,它能够读写大部分流行的文件格式,支持文件格式如下:png,jpg,tga,bmp,psd,gif,hdr,pic

libigl

官网:https://libigl.github.io/
源代码:https://github.com/libigl

libigl是一个简单的C++几何处理库。 他实现了很多功能包括构造稀疏离散微分几何算子和有限元矩阵。

OpenCV

官网:https://opencv.org/
源代码:https://github.com/opencv/opencv

它是一个开源计算机视觉库,提供了许多计算机视觉算法和工具,支持跨平台操作系统。它是最常用的C ++图像处理库之一。

ImageMagick

官网:https://imagemagick.org/
源代码:https://github.com/ImageMagick/ImageMagick

这是一个功能强大的图像处理库,它可以读取、处理和转换各种图像格式。它还提供了许多处理选项和过滤器,例如裁剪、缩放、旋转、反转等。

CImg

官网:https://cimg.eu/
源代码:https://github.com/GreycLab/CImg

它是一个小型快速的C++图像处理库,支持各种图像操作,例如过滤、变换、噪声生成等等。它还使用简单易懂的语法和良好的文档。

FFmpeg

官网:https://ffmpeg.org/
源代码:https://ffmpeg.org/download.html

FFmpeg是开源的音视频处理库,对音频、视频流的编码与解码非常方便,这个库很强大,包括libavcodec解码库、libavformat格式转换库,在抖音、快手、剪映等热门软件的安装包里可以解压出这些包。

VCL

官网:https://www.videolan.org/
源代码:https://code.videolan.org/videolan/libvlcpp

libVLC is the core engine and the interface to the multimedia framework on which VLC media player is based.

数据交换格式主要方式有CSV、EXCEL、XML、JSON

Rapidcsv

源代码:https://github.com/d99kris/rapidcsv

Rapidcsv is an easy-to-use C++ CSV parser library. It supports C++11 (and later), is header-only and comes with a basic test suite.

XML

参考上面XML解析库

jsoncpp

源代码:https://github.com/open-source-parsers/jsoncpp

JSON is a lightweight data-interchange format. It can represent numbers, strings, ordered sequences of values, and collections of name/value pairs.