представлять
base64По сути, это метод преобразования кодирования, который преобразуетASCIIПреобразование символов в обычный текст является одним из наиболее распространенных методов кодирования для передачи 8-битных байт-кодов в Интернете.
base64по буквамa-z,A-Z,0-9так же как+а также/, а также в качестве вспомогательного символа=, всего 65 символов составляют базовый набор символов, а все остальные символы могут быть преобразованы в символы набора символов в соответствии с определенными правилами.
abcde=>YWJjZGU=ABCDE=>QUJDREU=
В ежедневной разработке чаще всегоblobа такжеbase64конвертировать друг друга.
// blob to base64
function blobTobase64(blob) {
const fileReader = new FileReader()
let base64 = ''
fileReader.onload = () => {
base64 = fileReader.result // 读取base64
}
fileReader.readAsDataURL(blob) // 读取blob
}
// base64 to blob
function dataURItoBlob(dataURI) {
var mimeString = dataURI
.split(',')[0]
.split(':')[1]
.split(';')[0] // mime类型
var byteString = atob(dataURI.split(',')[1]) //base64 解码
var arrayBuffer = new ArrayBuffer(byteString.length) //创建ArrayBuffer
var intArray = new Uint8Array(arrayBuffer) //创建视图
for (var i = 0; i < byteString.length; i++) {
intArray[i] = byteString.charCodeAt(i)
}
return new Blob([intArray], { type: mimeString }) // 转成 blob
}
кодировать и декодировать
браузер
Последние браузеры поставляются с двумя методами дляbase64кодирование и декодирование
соответственноatobа такжеbtoa
- атоб: будет
base64Превратиться в8bitбайт-код - бтоа: будет
8bitбайт-код вbase64
Для старых браузеров вы можете использоватьjs-base64
Node
В настоящее времяnodeеще не поддерживается вatobа такжеbtoa, но может бытьBufferреализовать,Справочная документация
if (typeof btoa === 'undefined') {
global.btoa = function (str) {
return Buffer.from(str).toString('base64');
};
}
if (typeof atob === 'undefined') {
global.atob = function (b64Encoded) {
return Buffer.frome(b64Encoded, 'base64').toString();
};
}
Метод преобразования
Метод кодирования base64 неприменим к китайскому языку, поскольку китайский язык соответствует нескольким байтам, поэтому его можно использовать первым.
encodeURIComponentпосле кодированияbase64кодирование.
кодирование
-
Как группа из трех байтов, каждый байт составляет 8 бит, всего 24 двоичных бита.
'ABCD' ["ABC", "D"] // 每三字节做一组 ['01000001010000100100001', '01000100'] // 转成8bit -
24 двоичных бита каждой группы подразделяются на четыре группы, и каждая группа имеет 6 двоичных битов, что в настоящее время представляет собой двумерный массив.
[['010000', '010100', '001001', '000011'], ['010001', '00']]- Случай двух байтов: преобразуйте 16 двоичных битов этих двух байтов в три группы в соответствии с приведенными выше правилами, тогда последний элемент имеет только 4 бита, затем добавьте два 0 позади, чтобы компенсировать 6 бит, и добавьте символ заполнения в соответствующую позицию на третьем шаге
=. - Случай одного байта: 8 двоичных битов этого байта преобразуются в две группы в соответствии с приведенными выше правилами, тогда последний элемент имеет только 2 бита, затем сзади добавляются четыре 0, и соответствующая позиция на третьем шаге плюс два символа заполнения
=. - Проще говоря, сколько битов не хватает, добавьте столько нулей, сколько хотите, пока не достигнете 6 бит.
[['010000', '010100', '001001', '000011'], ['010001', '000000']]
- Случай двух байтов: преобразуйте 16 двоичных битов этих двух байтов в три группы в соответствии с приведенными выше правилами, тогда последний элемент имеет только 4 бита, затем добавьте два 0 позади, чтобы компенсировать 6 бит, и добавьте символ заполнения в соответствующую позицию на третьем шаге
-
Добавьте два 00 перед каждой группой, чтобы получить 32 двоичных бита, то есть четыре байта.
В правилах так написано, но я думаю этот шаг можно проигнорировать, т.к.
00101010а также101010это то же самое
-
Преобразуйте каждую группу соответствующего двоичного кода в десятичный, в
base64charНайдите соответствующий символ в наборе символов.[["Q", "U", "J", "D"], ["R", "A"]]-
Каждая группа должна в конечном итоге превратиться в четыре персонажа
-
Если имеется менее четырех символов, это означает, что в открытом тексте менее 3 байтов, поэтому необходимо добавить дополнительные символы.
=, составляют четыре символа
[["Q", "U", "J", "D"], ["R", "A", "=", "="]] -
-
Объедините окончательный результат в строку, которая является окончательным закодированным результатом.
'ABCD' > 'QUJDRA=='
В соответствии с методом кодирования каждые 3 байта будут закодированы в четыре символа, если меньше 3 байт, будут добавлены символы заполнения=, восполнить несколько недостающих.
btoa('A') // "QQ=="
btoa('AB') // "QUI="
btoa('ABC') // "QUJD"
btoa('ABCD') // "QUJDRA=="
расшифровка
Этап декодирования является обратным этапу кодирования.
- Группы по четыре байта каждая.
- Добавьте каждую группу символов, кроме пэда
=посторонние персонажи вbase64charНайдите индекс в наборе символов. - Преобразовать десятичный индекс в двоичный, если не хватает 6 цифр (оно не должно превышать 6 цифр), то заполнить в начале
0.- Если встречается символ пэда
=, указывающий, что открытый текст меньше 3 байт, то в соответствии с символом заполнения=, удалить соответствующий номер из последнего элемента группы0 - символ заполнения, затем удалите два
0 - два дополнительных символа, затем удалите четыре
0
- Если встречается символ пэда
- Объедините двоичные строки в каждой группе.В это время длина строки должна быть кратной 8, а затем разделить каждые 8 бит на байт.
- пройти через
String.fromCharCodeПреобразование двоичного кода в символы, затем объединение - Соедините каждый символ, чтобы получить окончательный декодированный результат.
Не по теме - базовая конверсия
- parseInt(str, radix): преобразовать строку в десятичную по системе счисления.
- initValue.toString(основание): преобразовать initValue в другое основание
// n进制转十进制
parseInt('1000', 2) // 8
parseInt('1000', 16) // 4096
// 进制间转换
(10).toString(2) // "1010", 10进制转2进制
(0xff).toString(2) // "11111111", 16进制转2进制
Ссылаться на
Оказывается, браузер изначально поддерживает кодировку и декодирование JS Base64.