本节记录各种类型的编码器。
1.Utf8
以 Utf8
格式进行解码、编码。
基础调用格式如下:
// 解码
CryptoJS.enc.Utf8.parse(utf8Str)
// 编码
CryptoJS.enc.Utf8.stringify(wordArray)
使用方式如下:
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
格式进行解码、编码。
基础调用格式如下:
// 解码
CryptoJS.enc.Utf16.parse(utf16Str)
// 编码
CryptoJS.enc.Utf16.stringify(wordArray)
使用方式如下:
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
格式进行解码、编码。
基础调用格式如下:
// 解码
CryptoJS.enc.Utf16BE.parse(utf16Str)
// 编码
CryptoJS.enc.Utf16BE.stringify(wordArray)
使用方式如下:
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
)是两种表示多字节数据的不同方式,它们决定了多字节数据中字节的排列顺序。
- 大端序(
Big-Endian
):
在大端序中,最高有效字节(Most Significant Byte,MSB
)位于最低地址处,而最低有效字节(Least Significant Byte,LSB
)位于最高地址处。
以十六进制表示一个 32
位整数时,例如 0x12345678
,大端序将字节排列为 12 34 56 78
。其中 12
是最高有效字节,78
是最低有效字节。 大端序在网络协议中较为常见,因为它可以确保不同架构的计算机在通信时能够正确解释数据。
- 小端序(
Little-Endian
):
在小端序中,最低有效字节(LSB
)位于最低地址处,而最高有效字节(MSB
)位于最高地址处。
以十六进制表示一个 32
位整数时,小端序将字节排列为 78 56 34 12
。其中 78
是最低有效字节,12
是最高有效字节。
大多数个人计算机和 x86
架构的处理器使用小端序,因此它在许多常见的计算机系统中是默认的字节序。
4.Utf16LE
以 Utf16LE
格式进行解码、编码。
基础调用格式如下:
// 解码
CryptoJS.enc.Utf16LE.parse(utf16Str)
// 编码
CryptoJS.enc.Utf16LE.stringify(wordArray)
使用方式如下:
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
编码广泛用于网络通信和数据存储中,通常用于将二进制数据(如图像、音频、视频文件)转换为文本格式,以便在文本协议(如HTTP
、XML
、JSON
)中传输或存储。
Base64
编码的特点包括:
字符集:
Base64
编码使用了64
个字符,通常是A-Z
、a-z
、0-9
和两个额外的字符(通常是+
和/
)。这些字符在不同的编码表中可能有所不同,但都是64
个字符。填充字符:
Base64
编码要求输入数据长度是3
的倍数,如果不满足这个条件,会使用一个或两个填充字符=
来补齐。这是为了确保编码结果的长度是4
的倍数,以便对齐。不加密:
Base64
不是加密算法,而是编码方式。它不会改变数据的内容,只是将二进制数据用不同的字符集表示出来。可打印字符:
Base64
编码的结果是由可打印字符组成的字符串,因此它可以安全地包含在文本数据中,而不会引起格式问题。
crypto-js
中 Base64
的相关属性和方法如下:
// _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
// 解码
CryptoJS.enc.Base64.parse(base64Str)
// 编码
CryptoJS.enc.Base64.stringify(wordArray)
使用如下:
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)
6.Base64url
Base64url
是为了在浏览器 URL
环境下使用的编码方式。
它与 Base64
的区别在于字符集不同。
譬如:
Base64
的字符集是 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
;
而 Base64url
的字符集则是 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
。
Base64
的加号(+
)和斜杠(/
)在URL
中具有特殊含义,它们用于表示URL
中的空格和路径分隔符;Base64
的等号(=
)在URL
中会被转义成%3D
。
为了避免这些问题,Base64url
编码通常将加号(+
)替换为减号(-
),并将斜杠(/
)替换为下划线(_
),同时避免了使用等号(=
)进行填充。
也就是说,如果需要在 URL
中传输 Base64
编码的数据,通常建议使用 Base64url
,以避免字符在 URL
中引起冲突或被错误解释。
假设目标文本是 this is a example
,那么 Base64
和 Base64url
的编码结果其实是不同的。
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)
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-9
和 A-F
,分别代表了 0
到 15
的十进制数字。
基础调用格式如下:
// 解码
CryptoJS.enc.Hex.parse(hexStr)
// 编码
CryptoJS.enc.Hex.stringify(wordArray)
使用方式如下:
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
字符集包括基本拉丁字母、数字、标点符号和一些特殊字符。
基础调用格式如下:
// 解码
CryptoJS.enc.Latin1.parse(latin1Str)
// 编码
CryptoJS.enc.Latin1.stringify(wordArray)
使用方式如下:
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)