1.ArkTs整改 imageknife目录下的cache文件夹
Signed-off-by: zhoulisheng1 <zhoulisheng1@huawei.com>
This commit is contained in:
parent
4bf8b03af6
commit
dbe32e7da8
|
@ -18,24 +18,24 @@ export class Base64 {
|
|||
private static sInstance: Base64;
|
||||
|
||||
public static getInstance(): Base64{
|
||||
if (!this.sInstance) {
|
||||
this.sInstance = new Base64();
|
||||
if (!Base64.sInstance) {
|
||||
Base64.sInstance = new Base64();
|
||||
}
|
||||
return this.sInstance;
|
||||
return Base64.sInstance;
|
||||
}
|
||||
|
||||
private constructor() {
|
||||
console.log("Base64 - constructor init!")
|
||||
for (var index = 0; index < this.chars.length; index++) {
|
||||
for (let index = 0; index < this.chars.length; index++) {
|
||||
this.lookup[this.chars.charCodeAt(index)] = index;
|
||||
}
|
||||
}
|
||||
|
||||
encode(arraybuffer: ArrayBuffer): string {
|
||||
let bytes = new Uint8Array(arraybuffer),
|
||||
i,
|
||||
len = bytes.length,
|
||||
base64 = '';
|
||||
let i:number = 0
|
||||
for (i = 0; i < len; i += 3) {
|
||||
base64 += this.chars[bytes[i] >> 2];
|
||||
base64 += this.chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
|
||||
|
@ -53,12 +53,12 @@ export class Base64 {
|
|||
decode(base64: string): ArrayBuffer{
|
||||
let bufferLength = base64.length * 0.75,
|
||||
len = base64.length,
|
||||
i,
|
||||
p = 0,
|
||||
encoded1,
|
||||
encoded2,
|
||||
encoded3,
|
||||
encoded4;
|
||||
p = 0;
|
||||
let i:number = 0;
|
||||
let encoded1:number = 0;
|
||||
let encoded2:number = 0;
|
||||
let encoded3:number = 0;
|
||||
let encoded4:number = 0;
|
||||
|
||||
if (base64[base64.length - 1] === '=') {
|
||||
bufferLength--;
|
||||
|
|
|
@ -38,7 +38,7 @@ export class CustomMap <K, V> {
|
|||
if (key == null || value == null) {
|
||||
throw new Error('key or value is invalid,checking the parameter');
|
||||
}
|
||||
var pre = this.map.get(key)
|
||||
let pre = this.map.get(key)
|
||||
if (this.hasKey(key)) {
|
||||
this.map.delete(key)
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ export class CustomMap <K, V> {
|
|||
return this.map.size;
|
||||
}
|
||||
// 遍历Map,执行处理函数. 回调函数 function(key,value,index){..}
|
||||
each(fn) {
|
||||
each(fn: (value: V, key: K, map: Map<K, V>) => void) {
|
||||
this.map.forEach(fn)
|
||||
}
|
||||
// 清除键值对
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Huawei Device Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import fs from '@ohos.file.fs';
|
||||
|
||||
export class FileReader {
|
||||
|
||||
// 文件大小
|
||||
fileLength: number = 0
|
||||
|
||||
// 读取的长度
|
||||
length: number = 0
|
||||
|
||||
// 读写stream
|
||||
stream: any = null
|
||||
// 缓存buf
|
||||
buf: ArrayBuffer = new ArrayBuffer(1)
|
||||
|
||||
constructor(path: string) {
|
||||
if (!path || Object.keys(path).length == 0) {
|
||||
return
|
||||
}
|
||||
try {
|
||||
this.stream = fs.createStreamSync(path, 'r+');
|
||||
var stat = fs.statSync(path)
|
||||
this.fileLength = stat.size
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 循环读取文件数据
|
||||
*/
|
||||
readLine(): string{
|
||||
var line = ''
|
||||
while (this.length <= this.fileLength) {
|
||||
this.stream.readSync(this.buf, { position: this.length })
|
||||
this.length++
|
||||
var temp = String.fromCharCode.apply(null, new Uint8Array(this.buf));
|
||||
line = line + temp
|
||||
if (temp == '\n' || temp == '\r') {
|
||||
return line
|
||||
}
|
||||
}
|
||||
return line
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断文件是否结束
|
||||
*/
|
||||
isEnd() {
|
||||
return this.fileLength <= 0 || this.length == this.fileLength
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭stream
|
||||
*/
|
||||
close() {
|
||||
this.stream.closeSync()
|
||||
}
|
||||
}
|
|
@ -14,20 +14,20 @@
|
|||
*/
|
||||
|
||||
import fs from '@ohos.file.fs';
|
||||
|
||||
import { BusinessError } from '@ohos.base'
|
||||
export class FileUtils {
|
||||
base64Str: string = ''
|
||||
private static sInstance: FileUtils;
|
||||
|
||||
public static getInstance(): FileUtils {
|
||||
if (!this.sInstance) {
|
||||
this.sInstance = new FileUtils();
|
||||
if (!FileUtils.sInstance) {
|
||||
FileUtils.sInstance = new FileUtils();
|
||||
}
|
||||
return this.sInstance;
|
||||
return FileUtils.sInstance;
|
||||
}
|
||||
|
||||
private constructor() {
|
||||
console.error("FileUtils - FileUtils constructor")
|
||||
console.log("FileUtils - FileUtils constructor")
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -50,7 +50,7 @@ export class FileUtils {
|
|||
fs.unlinkSync(path);
|
||||
}
|
||||
} catch (err) {
|
||||
console.log("FileUtils deleteFile Method has error, err msg=" + err.message + " err code=" + err.code);
|
||||
console.log("FileUtils deleteFile Method has error, err msg=" + (err as BusinessError).message + " err code=" + (err as BusinessError).code);
|
||||
}
|
||||
}
|
||||
/**
|
||||
|
@ -63,11 +63,11 @@ export class FileUtils {
|
|||
if (fileExist) {
|
||||
fs.unlink(path).then(()=>{
|
||||
resolve();
|
||||
}).catch(err=>{
|
||||
}).catch( (err:BusinessError)=>{
|
||||
reject(err)
|
||||
})
|
||||
}
|
||||
}).catch(err=>{
|
||||
}).catch((err:BusinessError)=>{
|
||||
reject(err);
|
||||
})
|
||||
})
|
||||
|
@ -89,7 +89,7 @@ export class FileUtils {
|
|||
* 异步删除文件目录 必须保证文件夹里面没有文件
|
||||
* @param path 待删除目录的绝对路径
|
||||
*/
|
||||
deleteFolderAsync(path: string, deleteComplete, deleteError) {
|
||||
deleteFolderAsync(path: string, deleteComplete:(value: void) => void | PromiseLike<void>, deleteError:(reason: Object) => PromiseLike<never>) {
|
||||
if (this.existFolder(path)) {
|
||||
fs.rmdir(path)
|
||||
.then(deleteComplete).catch(deleteError);
|
||||
|
@ -209,10 +209,10 @@ export class FileUtils {
|
|||
// 关闭文件
|
||||
fs.closeSync(file);
|
||||
resolve(buf);
|
||||
}).catch(err=>{
|
||||
}).catch((err:BusinessError)=>{
|
||||
reject(err);
|
||||
})
|
||||
}).catch(err=>{
|
||||
}).catch((err:BusinessError)=>{
|
||||
reject(err);
|
||||
})
|
||||
|
||||
|
@ -235,7 +235,9 @@ export class FileUtils {
|
|||
let ss = fs.createStreamSync(path, "r+");
|
||||
ss.readSync(buf)
|
||||
ss.closeSync();
|
||||
return String.fromCharCode.apply(null, new Uint8Array(buf))
|
||||
let u8:Uint8Array = new Uint8Array(buf);
|
||||
let array:Array<number> = Array.from(u8)
|
||||
return String.fromCharCode(...array)
|
||||
} catch (e) {
|
||||
console.log("FileUtils - readFilePic " + e)
|
||||
return ""
|
||||
|
@ -307,33 +309,18 @@ export class FileUtils {
|
|||
* string 转 Uint8Array
|
||||
* @param str 输入String
|
||||
*/
|
||||
stringToUint8Array(str): Uint8Array {
|
||||
var arr = [];
|
||||
for (var i = 0, j = str.length; i < j; ++i) {
|
||||
stringToUint8Array(str:string): Uint8Array {
|
||||
let arr:Array<number> = new Array<number>();
|
||||
for (let i = 0, j = str.length; i < j; ++i) {
|
||||
arr.push(str.charCodeAt(i));
|
||||
}
|
||||
var tmpUint8Array = new Uint8Array(arr);
|
||||
let tmpUint8Array = new Uint8Array(arr);
|
||||
return tmpUint8Array
|
||||
}
|
||||
|
||||
/**
|
||||
* int 转 byte[]
|
||||
* @param n 输入int
|
||||
*/
|
||||
intTobytes2(n) {
|
||||
var bytes = [];
|
||||
for (var i = 0; i < 2; i++) {
|
||||
bytes[i] = n >> (8 - i * 8);
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
uint8ArrayToBuffer(array: Uint8Array): ArrayBuffer {
|
||||
return array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset)
|
||||
}
|
||||
}
|
||||
|
||||
export interface AsyncCallback<T> {
|
||||
(err: string, data: T): void;
|
||||
}
|
|
@ -30,7 +30,7 @@ export class LruCache <K, V> {
|
|||
if (key == null || value == null) {
|
||||
throw new Error('key or value is invalid ');
|
||||
}
|
||||
var pre = this.map.get(key)
|
||||
let pre = this.map.get(key)
|
||||
if (pre == null) {
|
||||
this.size++
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ export class LruCache <K, V> {
|
|||
if (key == null) {
|
||||
throw new Error('key is null,checking the parameter');
|
||||
}
|
||||
var preValue = this.map.get(key)
|
||||
let preValue = this.map.get(key)
|
||||
if (this.map.remove(key)) {
|
||||
this.size--
|
||||
}
|
||||
|
@ -51,11 +51,11 @@ export class LruCache <K, V> {
|
|||
}
|
||||
|
||||
// 获取键为key的value
|
||||
get(key: K): V {
|
||||
get(key: K): V|undefined {
|
||||
if (key == null) {
|
||||
throw new Error('key is null,checking the parameter');
|
||||
}
|
||||
var preValue = this.map.get(key)
|
||||
let preValue = this.map.get(key)
|
||||
if (preValue != null) {
|
||||
this.entryRemoved(key, preValue, preValue)
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ export class LruCache <K, V> {
|
|||
* preValue 对应key键的旧value值
|
||||
* value 对应key键的新value值
|
||||
*/
|
||||
entryRemoved(key: K, preValue: V, value: V) {
|
||||
entryRemoved(key: K, preValue: V | undefined, value: V | undefined) {
|
||||
if (preValue != null) {
|
||||
this.map.remove(key)
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ export class LruCache <K, V> {
|
|||
if (this.size <= tempsize || this.map.isEmpty()) {
|
||||
break
|
||||
}
|
||||
var delkey = this.map.getFirstKey()
|
||||
let delkey = this.map.getFirstKey()
|
||||
this.map.remove(delkey)
|
||||
this.size--
|
||||
}
|
||||
|
@ -126,13 +126,13 @@ export class LruCache <K, V> {
|
|||
}
|
||||
|
||||
|
||||
this.map.each(function (value, key, index) {
|
||||
this.map.each( (value, key, index) => {
|
||||
printResult +='LruCache:key=' + key + 'value= ' + value;
|
||||
})
|
||||
return printResult;
|
||||
}
|
||||
|
||||
foreachLruCache(fn){
|
||||
foreachLruCache(fn:(value: V, key: K, map: Map<K, V>) => void){
|
||||
this.map.each(fn);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,392 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Huawei Device Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
export class Md5 {
|
||||
|
||||
// One time hashing functions
|
||||
public static hashStr(str: string, raw?: false): string
|
||||
|
||||
public static hashStr(str: string, raw: true): Int32Array
|
||||
|
||||
public static hashStr(str: string, raw: boolean = false) {
|
||||
return this.onePassHasher
|
||||
.start()
|
||||
.appendStr(str)
|
||||
.end(raw);
|
||||
}
|
||||
|
||||
public static hashAsciiStr(str: string, raw?: false): string
|
||||
|
||||
public static hashAsciiStr(str: string, raw: true): Int32Array
|
||||
|
||||
public static hashAsciiStr(str: string, raw: boolean = false) {
|
||||
return this.onePassHasher
|
||||
.start()
|
||||
.appendAsciiStr(str)
|
||||
.end(raw);
|
||||
}
|
||||
|
||||
// Private Static Variables
|
||||
private static stateIdentity = new Int32Array([1732584193, -271733879, -1732584194, 271733878]);
|
||||
private static buffer32Identity = new Int32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
private static hexChars = '0123456789abcdef';
|
||||
private static hexOut: string[] = [];
|
||||
|
||||
// Permanent instance is to use for one-call hashing
|
||||
private static onePassHasher = new Md5();
|
||||
|
||||
private static _hex(x: any): string {
|
||||
const hc = Md5.hexChars;
|
||||
const ho = Md5.hexOut;
|
||||
let n;
|
||||
let offset;
|
||||
let j;
|
||||
let i;
|
||||
|
||||
for (i = 0; i < 4; i += 1) {
|
||||
offset = i * 8;
|
||||
n = x[i];
|
||||
for (j = 0; j < 8; j += 2) {
|
||||
ho[offset + 1 + j] = hc.charAt(n & 0x0F);
|
||||
n >>>= 4;
|
||||
ho[offset + 0 + j] = hc.charAt(n & 0x0F);
|
||||
n >>>= 4;
|
||||
}
|
||||
}
|
||||
return ho.join('');
|
||||
}
|
||||
|
||||
private static _md5cycle(x: Int32Array | Uint32Array, k: Int32Array | Uint32Array) {
|
||||
let a = x[0];
|
||||
let b = x[1];
|
||||
let c = x[2];
|
||||
let d = x[3];
|
||||
// ff()
|
||||
a += (b & c | ~b & d) + k[0] - 680876936 | 0;
|
||||
a = (a << 7 | a >>> 25) + b | 0;
|
||||
d += (a & b | ~a & c) + k[1] - 389564586 | 0;
|
||||
d = (d << 12 | d >>> 20) + a | 0;
|
||||
c += (d & a | ~d & b) + k[2] + 606105819 | 0;
|
||||
c = (c << 17 | c >>> 15) + d | 0;
|
||||
b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
|
||||
b = (b << 22 | b >>> 10) + c | 0;
|
||||
a += (b & c | ~b & d) + k[4] - 176418897 | 0;
|
||||
a = (a << 7 | a >>> 25) + b | 0;
|
||||
d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
|
||||
d = (d << 12 | d >>> 20) + a | 0;
|
||||
c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
|
||||
c = (c << 17 | c >>> 15) + d | 0;
|
||||
b += (c & d | ~c & a) + k[7] - 45705983 | 0;
|
||||
b = (b << 22 | b >>> 10) + c | 0;
|
||||
a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
|
||||
a = (a << 7 | a >>> 25) + b | 0;
|
||||
d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
|
||||
d = (d << 12 | d >>> 20) + a | 0;
|
||||
c += (d & a | ~d & b) + k[10] - 42063 | 0;
|
||||
c = (c << 17 | c >>> 15) + d | 0;
|
||||
b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
|
||||
b = (b << 22 | b >>> 10) + c | 0;
|
||||
a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
|
||||
a = (a << 7 | a >>> 25) + b | 0;
|
||||
d += (a & b | ~a & c) + k[13] - 40341101 | 0;
|
||||
d = (d << 12 | d >>> 20) + a | 0;
|
||||
c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
|
||||
c = (c << 17 | c >>> 15) + d | 0;
|
||||
b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
|
||||
b = (b << 22 | b >>> 10) + c | 0;
|
||||
// gg()
|
||||
a += (b & d | c & ~d) + k[1] - 165796510 | 0;
|
||||
a = (a << 5 | a >>> 27) + b | 0;
|
||||
d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
|
||||
d = (d << 9 | d >>> 23) + a | 0;
|
||||
c += (d & b | a & ~b) + k[11] + 643717713 | 0;
|
||||
c = (c << 14 | c >>> 18) + d | 0;
|
||||
b += (c & a | d & ~a) + k[0] - 373897302 | 0;
|
||||
b = (b << 20 | b >>> 12) + c | 0;
|
||||
a += (b & d | c & ~d) + k[5] - 701558691 | 0;
|
||||
a = (a << 5 | a >>> 27) + b | 0;
|
||||
d += (a & c | b & ~c) + k[10] + 38016083 | 0;
|
||||
d = (d << 9 | d >>> 23) + a | 0;
|
||||
c += (d & b | a & ~b) + k[15] - 660478335 | 0;
|
||||
c = (c << 14 | c >>> 18) + d | 0;
|
||||
b += (c & a | d & ~a) + k[4] - 405537848 | 0;
|
||||
b = (b << 20 | b >>> 12) + c | 0;
|
||||
a += (b & d | c & ~d) + k[9] + 568446438 | 0;
|
||||
a = (a << 5 | a >>> 27) + b | 0;
|
||||
d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
|
||||
d = (d << 9 | d >>> 23) + a | 0;
|
||||
c += (d & b | a & ~b) + k[3] - 187363961 | 0;
|
||||
c = (c << 14 | c >>> 18) + d | 0;
|
||||
b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
|
||||
b = (b << 20 | b >>> 12) + c | 0;
|
||||
a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
|
||||
a = (a << 5 | a >>> 27) + b | 0;
|
||||
d += (a & c | b & ~c) + k[2] - 51403784 | 0;
|
||||
d = (d << 9 | d >>> 23) + a | 0;
|
||||
c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
|
||||
c = (c << 14 | c >>> 18) + d | 0;
|
||||
b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
|
||||
b = (b << 20 | b >>> 12) + c | 0;
|
||||
// hh()
|
||||
a += (b ^ c ^ d) + k[5] - 378558 | 0;
|
||||
a = (a << 4 | a >>> 28) + b | 0;
|
||||
d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
|
||||
d = (d << 11 | d >>> 21) + a | 0;
|
||||
c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
|
||||
c = (c << 16 | c >>> 16) + d | 0;
|
||||
b += (c ^ d ^ a) + k[14] - 35309556 | 0;
|
||||
b = (b << 23 | b >>> 9) + c | 0;
|
||||
a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
|
||||
a = (a << 4 | a >>> 28) + b | 0;
|
||||
d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
|
||||
d = (d << 11 | d >>> 21) + a | 0;
|
||||
c += (d ^ a ^ b) + k[7] - 155497632 | 0;
|
||||
c = (c << 16 | c >>> 16) + d | 0;
|
||||
b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
|
||||
b = (b << 23 | b >>> 9) + c | 0;
|
||||
a += (b ^ c ^ d) + k[13] + 681279174 | 0;
|
||||
a = (a << 4 | a >>> 28) + b | 0;
|
||||
d += (a ^ b ^ c) + k[0] - 358537222 | 0;
|
||||
d = (d << 11 | d >>> 21) + a | 0;
|
||||
c += (d ^ a ^ b) + k[3] - 722521979 | 0;
|
||||
c = (c << 16 | c >>> 16) + d | 0;
|
||||
b += (c ^ d ^ a) + k[6] + 76029189 | 0;
|
||||
b = (b << 23 | b >>> 9) + c | 0;
|
||||
a += (b ^ c ^ d) + k[9] - 640364487 | 0;
|
||||
a = (a << 4 | a >>> 28) + b | 0;
|
||||
d += (a ^ b ^ c) + k[12] - 421815835 | 0;
|
||||
d = (d << 11 | d >>> 21) + a | 0;
|
||||
c += (d ^ a ^ b) + k[15] + 530742520 | 0;
|
||||
c = (c << 16 | c >>> 16) + d | 0;
|
||||
b += (c ^ d ^ a) + k[2] - 995338651 | 0;
|
||||
b = (b << 23 | b >>> 9) + c | 0;
|
||||
// ii()
|
||||
a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
|
||||
a = (a << 6 | a >>> 26) + b | 0;
|
||||
d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
|
||||
d = (d << 10 | d >>> 22) + a | 0;
|
||||
c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
|
||||
c = (c << 15 | c >>> 17) + d | 0;
|
||||
b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
|
||||
b = (b << 21 | b >>> 11) + c | 0;
|
||||
a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
|
||||
a = (a << 6 | a >>> 26) + b | 0;
|
||||
d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
|
||||
d = (d << 10 | d >>> 22) + a | 0;
|
||||
c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
|
||||
c = (c << 15 | c >>> 17) + d | 0;
|
||||
b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
|
||||
b = (b << 21 | b >>> 11) + c | 0;
|
||||
a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
|
||||
a = (a << 6 | a >>> 26) + b | 0;
|
||||
d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
|
||||
d = (d << 10 | d >>> 22) + a | 0;
|
||||
c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
|
||||
c = (c << 15 | c >>> 17) + d | 0;
|
||||
b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
|
||||
b = (b << 21 | b >>> 11) + c | 0;
|
||||
a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
|
||||
a = (a << 6 | a >>> 26) + b | 0;
|
||||
d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
|
||||
d = (d << 10 | d >>> 22) + a | 0;
|
||||
c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
|
||||
c = (c << 15 | c >>> 17) + d | 0;
|
||||
b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
|
||||
b = (b << 21 | b >>> 11) + c | 0;
|
||||
|
||||
x[0] = a + x[0] | 0;
|
||||
x[1] = b + x[1] | 0;
|
||||
x[2] = c + x[2] | 0;
|
||||
x[3] = d + x[3] | 0;
|
||||
}
|
||||
|
||||
private _dataLength: number;
|
||||
private _bufferLength: number;
|
||||
private _state: Int32Array = new Int32Array(4);
|
||||
private _buffer: ArrayBuffer = new ArrayBuffer(68);
|
||||
private _buffer8: Uint8Array;
|
||||
private _buffer32: Uint32Array;
|
||||
|
||||
constructor() {
|
||||
this._buffer8 = new Uint8Array(this._buffer, 0, 68);
|
||||
this._buffer32 = new Uint32Array(this._buffer, 0, 17);
|
||||
this.start();
|
||||
}
|
||||
|
||||
public start() {
|
||||
this._dataLength = 0;
|
||||
this._bufferLength = 0;
|
||||
this._state.set(Md5.stateIdentity);
|
||||
return this;
|
||||
}
|
||||
|
||||
// Char to code point to to array conversion:
|
||||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt
|
||||
// #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown
|
||||
public appendStr(str: string) {
|
||||
const buf8 = this._buffer8;
|
||||
const buf32 = this._buffer32;
|
||||
let bufLen = this._bufferLength;
|
||||
let code;
|
||||
let i;
|
||||
|
||||
for (i = 0; i < str.length; i += 1) {
|
||||
code = str.charCodeAt(i);
|
||||
if (code < 128) {
|
||||
buf8[bufLen++] = code;
|
||||
} else if (code < 0x800) {
|
||||
buf8[bufLen++] = (code >>> 6) + 0xC0;
|
||||
buf8[bufLen++] = code & 0x3F | 0x80;
|
||||
} else if (code < 0xD800 || code > 0xDBFF) {
|
||||
buf8[bufLen++] = (code >>> 12) + 0xE0;
|
||||
buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;
|
||||
buf8[bufLen++] = (code & 0x3F) | 0x80;
|
||||
} else {
|
||||
code = ((code - 0xD800) * 0x400) + (str.charCodeAt(++i) - 0xDC00) + 0x10000;
|
||||
if (code > 0x10FFFF) {
|
||||
throw new Error('Unicode standard supports code points up to U+10FFFF');
|
||||
}
|
||||
buf8[bufLen++] = (code >>> 18) + 0xF0;
|
||||
buf8[bufLen++] = (code >>> 12 & 0x3F) | 0x80;
|
||||
buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;
|
||||
buf8[bufLen++] = (code & 0x3F) | 0x80;
|
||||
}
|
||||
if (bufLen >= 64) {
|
||||
this._dataLength += 64;
|
||||
Md5._md5cycle(this._state, buf32);
|
||||
bufLen -= 64;
|
||||
buf32[0] = buf32[16];
|
||||
}
|
||||
}
|
||||
this._bufferLength = bufLen;
|
||||
return this;
|
||||
}
|
||||
|
||||
public appendAsciiStr(str: string) {
|
||||
const buf8 = this._buffer8;
|
||||
const buf32 = this._buffer32;
|
||||
let bufLen = this._bufferLength;
|
||||
let i;
|
||||
let j = 0;
|
||||
|
||||
for (;; ) {
|
||||
i = Math.min(str.length - j, 64 - bufLen);
|
||||
while (i--) {
|
||||
buf8[bufLen++] = str.charCodeAt(j++);
|
||||
}
|
||||
if (bufLen < 64) {
|
||||
break;
|
||||
}
|
||||
this._dataLength += 64;
|
||||
Md5._md5cycle(this._state, buf32);
|
||||
bufLen = 0;
|
||||
}
|
||||
this._bufferLength = bufLen;
|
||||
return this;
|
||||
}
|
||||
|
||||
public appendByteArray(input: Uint8Array) {
|
||||
const buf8 = this._buffer8;
|
||||
const buf32 = this._buffer32;
|
||||
let bufLen = this._bufferLength;
|
||||
let i;
|
||||
let j = 0;
|
||||
|
||||
for (;; ) {
|
||||
i = Math.min(input.length - j, 64 - bufLen);
|
||||
while (i--) {
|
||||
buf8[bufLen++] = input[j++];
|
||||
}
|
||||
if (bufLen < 64) {
|
||||
break;
|
||||
}
|
||||
this._dataLength += 64;
|
||||
Md5._md5cycle(this._state, buf32);
|
||||
bufLen = 0;
|
||||
}
|
||||
this._bufferLength = bufLen;
|
||||
return this;
|
||||
}
|
||||
|
||||
public getState() {
|
||||
const self = this;
|
||||
const s = self._state;
|
||||
|
||||
return {
|
||||
buffer: String.fromCharCode.apply(null, self._buffer8),
|
||||
buflen: self._bufferLength,
|
||||
length: self._dataLength,
|
||||
state: [s[0], s[1], s[2], s[3]]
|
||||
};
|
||||
}
|
||||
|
||||
public setState(state: any) {
|
||||
const buf = state.buffer;
|
||||
const x = state.state;
|
||||
const s = this._state;
|
||||
let i;
|
||||
|
||||
this._dataLength = state.length;
|
||||
this._bufferLength = state.buflen;
|
||||
s[0] = x[0];
|
||||
s[1] = x[1];
|
||||
s[2] = x[2];
|
||||
s[3] = x[3];
|
||||
|
||||
for (i = 0; i < buf.length; i += 1) {
|
||||
this._buffer8[i] = buf.charCodeAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
public end(raw: boolean = false) {
|
||||
const bufLen = this._bufferLength;
|
||||
const buf8 = this._buffer8;
|
||||
const buf32 = this._buffer32;
|
||||
const i = (bufLen >> 2) + 1;
|
||||
let dataBitsLen;
|
||||
|
||||
this._dataLength += bufLen;
|
||||
|
||||
buf8[bufLen] = 0x80;
|
||||
buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0;
|
||||
buf32.set(Md5.buffer32Identity.subarray(i), i);
|
||||
|
||||
if (bufLen > 55) {
|
||||
Md5._md5cycle(this._state, buf32);
|
||||
buf32.set(Md5.buffer32Identity);
|
||||
}
|
||||
|
||||
// Do the final computation based on the tail and length
|
||||
// Beware that the final length may not fit in 32 bits so we take care of that
|
||||
dataBitsLen = this._dataLength * 8;
|
||||
if (dataBitsLen <= 0xFFFFFFFF) {
|
||||
buf32[14] = dataBitsLen;
|
||||
} else {
|
||||
const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/);
|
||||
if (matches === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
const lo = parseInt(matches[2], 16);
|
||||
const hi = parseInt(matches[1], 16) || 0;
|
||||
|
||||
buf32[14] = lo;
|
||||
buf32[15] = hi;
|
||||
}
|
||||
|
||||
Md5._md5cycle(this._state, buf32);
|
||||
|
||||
return raw ? this._state : Md5._hex(this._state);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue