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)
}