hushicai / hushicai.github.io

Blog
https://hushicai.github.io
27 stars 1 forks source link

二进制与base64 #86

Open hushicai opened 4 years ago

hushicai commented 4 years ago

二进制转base64

在浏览器端,我们可以利用btoa来转换,其定义如下:

let encodedData = window.btoa(stringToEncode);

按照mdn上的文档,参数stringToEncode

一个字符串, 其字符分别表示要编码为 ASCII 的二进制数据的单个字节。

btoa会自动stringToEncode中的每个字符转化为对应的二进制编码(unicode代码点):

window.btoa('Hello, World')
// SGVsbG8sIFdvcmxk

虽然字面上是文本,但其实也是“二进制”转base64。

如果输入内容是一串8位比特字符串:

"1001000,1100101,1101100,1101100,1101111,101100,100000,1010111,1101111,1110010,1101100,1100100"

为了方便处理,这里用逗号分隔。

// 比特串转为文本
const binaryStringToText = binaryString => {
  return binaryString.split(',').map(b => {
    return String.fromCharCode(parseInt(b, 2));
  }).join('');
};
const binaryStringToBase64 = binaryString => {
  let text = binaryStringToText(binaryString);
 return window.btoa(text);
};
binaryStringToBase64("1001000,1100101,1101100,1101100,1101111,101100,100000,1010111,1101111,1110010,1101100,1100100");
// SGVsbG8sIFdvcmxk

如果输入内容是一串ASCII编码的字符串:

72,101,108,108,111,44,32,87,111,114,108,100

我们换一种方式来处理,使用Uint8Array:

const binaryStringToText = binaryString => {
  let data = binaryString.split(',').map(v => +v);
  return String.fromCharCode(...new Uint8Array(data));
};

const binaryStringToBase64 = binaryString => {
  let text = binaryStringToText(binaryString);
 return window.btoa(text);
};
binaryStringToBase64("72,101,108,108,111,44,32,87,111,114,108,100");
// SGVsbG8sIFdvcmxk

base64转二进制

base64转为二进制,首先需要通过atob来解码,其定义如下:

var decodedData = window.atob(encodedData);

如果传入字符串不是有效的 base64 字符串,比如其长度不是 4 的倍数,则抛出DOMException

const  base64ToBinary = base64 => {
  let text = window.atob(base64);
  let textLength = text.length;
  let array = new Uint8Array(new ArrayBuffer(textLength));

  for(i = 0; i < textLength; i++) {
    array[i] = text.charCodeAt(i);
  }
  return array;
}

let uInt8Array = base64ToBinary('SGVsbG8sIFdvcmxk');
// Uint8Array(12) [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100]

binaryStringToText(uInt8Array.toString());
// Hello, World
hushicai commented 4 years ago

如果是纯JS实现,请参考js-base64

hushicai commented 4 years ago

base64编码算法,请参考Base64