Skip to content

convert 封装的一些转换函数

ts
/**
 * Blob对象转File  IE不支持File对象,数据流转时Blob对象就可以
 * @param blob blob对象
 * @param fileName 文件名称
 */
export function blobToFile(blob: Blob, fileName: string): File {
  return new File([blob], fileName)
}
/**
 * 字节数组转Blob(File)对象
 * @param arraybuffer 用new Uint8Array包裹的字节数组
 * @param mimeType 文件类型  fs:image/png
 */
export function arrayBufferToBlob(arraybuffer: ArrayBuffer, mimeType: string): Blob {
  return new Blob([arraybuffer], { type: mimeType })
}

/**
 * 普通字符串转二进制字符串
 * @param str 普通字符串
 * @returns
 */
export function stringToBinary(str: string) {
  return encodeURIComponent(str).replace(/%([a-zA-Z0-9]{2})/g, (m, s: string) => {
    return String.fromCodePoint(parseInt(s, 16))
  })
}
/**
 * 二进制字符串转普通字符串
 * @param binary 二进制字符串
 * @returns
 */
export function binaryToString(binary: string) {
  return decodeURIComponent(
    binary
      .split('')
      .map(c => {
        return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`
      })
      .join('')
  )
}
/**
 * 普通字符串转二进制(字节数组)
 * @param str 普通字符串
 * @returns
 */
export function stringToBinaryByte(str: string) {
  const binary = stringToBinary(str)
  const byte = Array.prototype.map.call(binary, s => {
    return s.charCodeAt(0)
  }) as number[]
  return new Uint8Array(byte)
}

/**
 * 二进制字节数组转普通字符串
 * @param byte 字节数组
 * @returns
 */
export function binaryByteToString(byte: Uint8Array) {
  let binary = ''
  for (let index = 0; index < byte.length; index++) {
    const code = byte[index]
    binary += String.fromCharCode(code)
  }
  return binaryToString(binary)
}

/**
 * 整数转字节数组
 * @param integer
 */
export function integerToArrayBuffer(integer: number) {
  if (!integer) {
    throw new Error('integer 未找到')
  }
  if (integer > Number.MAX_SAFE_INTEGER) {
    throw new Error('integer 超出 MAX_SAFE_INTEGER')
  }
  const str = integer.toString(2)
  const len = Math.ceil(str.length / 8)
  const binaryString = str.padStart(len * 8, '0')
  const uint8Array = new Uint8Array(len)
  for (let i = 0; i < uint8Array.length; i++) {
    uint8Array[i] = parseInt(binaryString.substring(i * 8, i * 8 + 8), 2)
  }
  return uint8Array
}

/**
 * 字节数组转整数
 * @param array
 */

export function arrayBufferToInteger(array: Uint8Array) {
  if (!array) {
    throw new Error('array 未找到')
  }
  if (!(array instanceof Uint8Array)) {
    throw new Error('array 不是 Uint8Array')
  }
  let binaryString = ''
  for (let i = 0; i < array.length; i++) {
    const byte = array[i]
    binaryString += byte.toString(2).padStart(8, '0')
  }
  return binaryString && parseInt(binaryString, 2)
}

/**
 * 整数形式的ip转字符串形式
 * @param integer
 */
export function integerToIpString(integer: number) {
  if (!integer) {
    throw new Error('integer 找不到')
  }
  if (integer > 4294967296 || integer < 0) {
    throw new Error('integer 不是个整型形式的ip')
  }
  const binaryString = integer.toString(2).padStart(32, '0')
  const array = new Array(4)
  for (let i = 0; i < array.length; i++) {
    array[i] = parseInt(binaryString.substring(i * 8, i * 8 + 8), 2)
  }
  return array.join('.')
}

/**
 * 字符串形式的ip转整数形式
 * @param ipString
 */
export function ipStringToInteger(ipString: string) {
  if (!ipString) {
    throw new Error('ipString 找不到')
  }
  if (
    !/^(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}$/.test(
      ipString
    )
  ) {
    throw new Error('ipString 不是正确的ip')
  }
  const binaryString = ipString
    .split('.')
    .map(s => parseInt(s, 10).toString(2).padStart(8, '0'))
    .join('')
  return parseInt(binaryString, 2)
}