Skip to content

本节记录各种类型的编码器。

1.Utf8

Utf8 格式进行解码、编码。

基础调用格式如下:

js
// 解码
CryptoJS.enc.Utf8.parse(utf8Str)

// 编码
CryptoJS.enc.Utf8.stringify(wordArray)

使用方式如下:

js
const CryptoJs = require('crypto-js')

const text = 'Hello'

const parseText = CryptoJs.enc.Utf8.parse(text)

const stringifyText = CryptoJs.enc.Utf8.stringify(parseText)

// { words: [ 1214606444, 1862270976 ], sigBytes: 5 }
console.log(parseText)

// Hello
console.log(stringifyText)

2.Utf16

Utf16 格式进行解码、编码。

基础调用格式如下:

js
// 解码
CryptoJS.enc.Utf16.parse(utf16Str)

// 编码
CryptoJS.enc.Utf16.stringify(wordArray)

使用方式如下:

js
const CryptoJs = require('crypto-js')

const text = 'Hello'

const parseText = CryptoJs.enc.Utf16.parse(text)

const stringifyText = CryptoJs.enc.Utf16.stringify(parseText)

// { words: [ 4718693, 7077996, 7274496 ], sigBytes: 10 }
console.log(parseText)

// Hello
console.log(stringifyText)

TIP

本节的 Utf16 采用的是大端序方式,与下一节 Utf16BE 方法的执行结果一致。

3.Utf16BE

Utf16BE 格式进行解码、编码。

基础调用格式如下:

js
// 解码
CryptoJS.enc.Utf16BE.parse(utf16Str)

// 编码
CryptoJS.enc.Utf16BE.stringify(wordArray)

使用方式如下:

js
const CryptoJs = require('crypto-js')

const text = 'Hello'

const parseText = CryptoJs.enc.Utf16BE.parse(text)

const stringifyText = CryptoJs.enc.Utf16BE.stringify(parseText)

// { words: [ 4718693, 7077996, 7274496 ], sigBytes: 10 }
console.log(parseText)

// Hello
console.log(stringifyText)

TIP

大端序(Big-Endian)和小端序(Little-Endian)是两种表示多字节数据的不同方式,它们决定了多字节数据中字节的排列顺序。

  1. 大端序(Big-Endian):

在大端序中,最高有效字节(Most Significant Byte,MSB)位于最低地址处,而最低有效字节(Least Significant Byte,LSB)位于最高地址处。

以十六进制表示一个 32 位整数时,例如 0x12345678,大端序将字节排列为 12 34 56 78。其中 12 是最高有效字节,78 是最低有效字节。 大端序在网络协议中较为常见,因为它可以确保不同架构的计算机在通信时能够正确解释数据。

  1. 小端序(Little-Endian):

在小端序中,最低有效字节(LSB)位于最低地址处,而最高有效字节(MSB)位于最高地址处。

以十六进制表示一个 32 位整数时,小端序将字节排列为 78 56 34 12。其中 78 是最低有效字节,12 是最高有效字节。

大多数个人计算机和 x86 架构的处理器使用小端序,因此它在许多常见的计算机系统中是默认的字节序。

4.Utf16LE

Utf16LE 格式进行解码、编码。

基础调用格式如下:

js
// 解码
CryptoJS.enc.Utf16LE.parse(utf16Str)

// 编码
CryptoJS.enc.Utf16LE.stringify(wordArray)

使用方式如下:

js
const CryptoJs = require('crypto-js')

const text = 'Hello'

const parseText = CryptoJs.enc.Utf16LE.parse(text)

const stringifyText = CryptoJs.enc.Utf16LE.stringify(parseText)

// { words: [ 1207985408, 1811966976, 1862270976 ], sigBytes: 10 }
console.log(parseText)

// Hello
console.log(stringifyText)

5.Base64

Base64 是一种用于二进制数据编码为可打印字符的编码方式

它的名称 Base64 表示它使用 64 个不同的字符来表示数据。

Base64 编码广泛用于网络通信和数据存储中,通常用于将二进制数据(如图像、音频、视频文件)转换为文本格式,以便在文本协议(如HTTPXMLJSON)中传输或存储。

Base64 编码的特点包括:

  1. 字符集:Base64 编码使用了 64 个字符,通常是 A-Za-z0-9 和两个额外的字符(通常是 +/)。这些字符在不同的编码表中可能有所不同,但都是 64 个字符。

  2. 填充字符:Base64 编码要求输入数据长度是 3 的倍数,如果不满足这个条件,会使用一个或两个填充字符 = 来补齐。这是为了确保编码结果的长度是 4 的倍数,以便对齐。

  3. 不加密:Base64 不是加密算法,而是编码方式。它不会改变数据的内容,只是将二进制数据用不同的字符集表示出来。

  4. 可打印字符:Base64 编码的结果是由可打印字符组成的字符串,因此它可以安全地包含在文本数据中,而不会引起格式问题。

crypto-jsBase64 的相关属性和方法如下:

js
// _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

// 解码
CryptoJS.enc.Base64.parse(base64Str)

// 编码
CryptoJS.enc.Base64.stringify(wordArray)

使用如下:

js
const CryptoJS = require('crypto-js')

const text = '😂'

const utf8ParseText = CryptoJS.enc.Utf8.parse(text)

const stringifyText = CryptoJS.enc.Base64.stringify(utf8ParseText)

console.log('utf8ParseText', utf8ParseText)

console.log('stringifyText', stringifyText)

彻底弄懂base64的编码与解码原理

6.Base64url

Base64url 是为了在浏览器 URL 环境下使用的编码方式。

它与 Base64 的区别在于字符集不同

譬如:

Base64 的字符集是 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

Base64url 的字符集则是 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

  1. Base64 的加号(+)和斜杠(/)在 URL 中具有特殊含义,它们用于表示 URL 中的空格和路径分隔符;

  2. Base64 的等号(=)在 URL 中会被转义成 %3D

为了避免这些问题,Base64url 编码通常将加号(+)替换为减号(-),并将斜杠(/)替换为下划线(_),同时避免了使用等号(=)进行填充。

也就是说,如果需要在 URL 中传输 Base64 编码的数据,通常建议使用 Base64url,以避免字符在 URL 中引起冲突或被错误解释。

假设目标文本是 this is a example,那么 Base64Base64url 的编码结果其实是不同的。

js
const CryptoJS = require('crypto-js')

const text = 'this is a example'

const utf8ParseText = CryptoJS.enc.Utf8.parse(text)

const stringifyText = CryptoJS.enc.Base64.stringify(utf8ParseText)

// dGhpcyBpcyBhIGV4YW1wbGU=
console.log('stringifyText', stringifyText)
js
const text = 'this is a example'

const utf8ParseText = CryptoJS.enc.Utf8.parse(text)

const stringifyText = CryptoJS.enc.Base64url.stringify(utf8ParseText)

// dGhpcyBpcyBhIGV4YW1wbGU
console.log('stringifyText', stringifyText)

7.Hex

Hex 是指十六进制(Hexadecimal)的缩写。

十六进制是一种用于表示数字的进制系统,它使用 16 个不同的符号来表示数字,这些符号包括 0-9A-F,分别代表了 015 的十进制数字。

基础调用格式如下:

js
// 解码
CryptoJS.enc.Hex.parse(hexStr)

// 编码
CryptoJS.enc.Hex.stringify(wordArray)

使用方式如下:

js
const CryptoJs = require('crypto-js')

const text = '48656c6c6f2c20576f726c6421'

const parseText = CryptoJs.enc.Hex.parse(text)

const stringifyText = CryptoJs.enc.Hex.stringify(parseText)

// { words: [ 1214606444, 1865162839, 1869769828, 553648128 ], sigBytes: 13 }
// Hello, World!
console.log(parseText, CryptoJs.enc.Utf8.stringify(parseText))

// 48656c6c6f2c20576f726c6421
console.log(stringifyText)

8.Latin1

Latin-1 字符集(也称为ISO 8859-1)是一种字符编码,包括了西欧语言中的大多数字符,如英语、法语、德语、西班牙语等。

Latin-1 字符集包括基本拉丁字母、数字、标点符号和一些特殊字符。

基础调用格式如下:

js
// 解码
CryptoJS.enc.Latin1.parse(latin1Str)

// 编码
CryptoJS.enc.Latin1.stringify(wordArray)

使用方式如下:

js
const CryptoJS = require('crypto-js')

const text = 'Hello'

const parseText = CryptoJS.enc.Latin1.parse(text)

const stringifyText = CryptoJS.enc.Latin1.stringify(parseText)

// { words: [ 1214606444, 1862270976 ], sigBytes: 5 }
console.log(parseText)

// Hello
console.log(stringifyText)