本节记录各种类型的编码器。
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)