Skip to content

base64 封装的一些 base64 操作函数

typescript
/**
 * base64编码
 * 先encodeURIComponent对字符进行编码,然后获取二进制数据的十六进制字符串,然后从码点得到二进制字符串
 * @param str
 * @returns
 */
export function base64Encode(str: string) {
  return btoa(
    encodeURIComponent(str).replace(/%([a-zA-Z0-9]{2})/g, (m, s: string) => {
      return String.fromCodePoint(parseInt(s, 16))
    })
  )
}

/**
 * base64解码
 * 先将base64进行解码,然后对二进制字符串获取码点,然后转换成十六进制,然后拼接%AA的形式通过decodeURIComponent进行解编码
 * @param str
 * @returns
 */
export function base64Decode(str: string) {
  return decodeURIComponent(
    atob(str)
      .split('')
      .map(c => {
        return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`
      })
      .join('')
  )
}

/**
 * base64转字节数组
 * @param base64Str base64的字符串
 */
export function base64ToArrayBuffer(base64Str: string): ArrayBuffer {
  const data = atob(base64Str)
  const buffer = new Uint8Array(data.length)
  for (let index = 0; index < data.length; index++) {
    const val = data[index]
    buffer[index] = val.charCodeAt(0)
  }
  return buffer
}

/**
 * 字节数组转base64
 * @param arraybuffer
 */
export function arrayBufferToBase64(arraybuffer: ArrayBuffer): string {
  const bytes = new Uint8Array(arraybuffer)
  let res = ''
  bytes.forEach(v => {
    res += String.fromCharCode(v)
  })
  return btoa(res)
}

/**
 * 通过base64数据转Blob(File)对象
 * @param  base64 数据的base64
 * @param  mimeType 文件类型  eg:image/png
 */
export function base64ToBlob(base64Str: string, mimeType: string): Blob {
  return new Blob([base64ToArrayBuffer(base64Str)], { type: mimeType })
}

/**
 * 从base64到dataUrl,默认application/octet-stream
 * @param base64Str
 * @param mimeType
 * @returns
 */
export function base64ToDataURL(base64Str: string, mimeType: string = 'application/octet-stream') {
  return `data:${mimeType};base64,${base64Str}`
}