UNPKG

febs

Version:

febs is a useful utilities set

375 lines (317 loc) 7.5 kB
'use strict'; /** * Copyright (c) 2017 Copyright brainpoint All Rights Reserved. * Author: lipengxiang * Desc: */ var fs = require('fs'); var crypto = require('crypto'); // var { v4: uuidv4 } = require('uuid'); var crypt = require('../browser/common/crypt'); var cryptUUID = require('../browser/libs/crypt'); /** * @desc: 计算crc32值. * @param str: string or buffer. * @param crc 可以在这个值得基础上继续计算 * @return: crc32. */ function crc32( str, crc ) { if( crc == undefined || crc == null ) crc = 0; crc = crc ^ (-1); if (str instanceof Buffer) { var c; for( var i1 = 0, iTop1 = str.length; i1 < iTop1; i1++ ) { c = str.readUInt8(i1); crc = (crc >>> 8) ^ crypt.crc32_table[(crc ^ c) & 0xFF]; } } else { for( var i = 0, iTop = str.length; i < iTop; i++ ) { crc = (crc >>> 8) ^ crypt.crc32_table[(crc ^ str.charCodeAt(i)) & 0xFF]; } } return crc ^ (-1); }; exports.crc32 = crc32; /** * @desc: * @return:u32. crc32 */ function crc32_fileSegment( filename, offset, length ) { var stat = fs.statSync(filename); if (stat && stat.isFile() && stat.size > 0) { try { if (offset >= stat.size || offset < 0 || length == 0) { return 0; } if (length < 0) { length = stat.size; } if (stat.size-offset < length) { length = file.size-offset; } var fd = fs.openSync(filename, 'r'); if (!fd) return 0; var crc = 0; var buf = new Buffer(1024*10); var size; for (var i = offset, len = offset+length; i < len; i+=buf.length) { size = buf.length > len-i ? len-i : buf.length; if (fs.readSync(fd, buf, 0, size, i) != size) { crc = 0; break; } crc = crc32(buf.slice(0, size), crc); } fs.closeSync(fd); return crc; }catch(e) { return 0; } } else { return 0; } }; exports.crc32_fileSegment = crc32_fileSegment; /** * @desc: * @return:u32. crc32 */ exports.crc32_file = function( filename ) { return crc32_fileSegment(filename, 0, -1); }; /** * @desc: 计算字符串的md5值 * @return: string. */ exports.md5 = function ( /* String */ str ) { var md5 = crypto.createHash('md5'); md5.update(str); return md5.digest('hex'); } /** * @desc: * @return:string;错误返回null. */ exports.md5_file = function( filename ) { var stat = fs.statSync(filename); if (stat && stat.isFile() && stat.size > 0) { var fd = null; try { fd = fs.openSync(filename, 'r'); if (!fd) return 0; var buf = new Buffer(1024*10); var size; var md5 = crypto.createHash('md5'); for (var i = 0, len = stat.size; i < len; i+=buf.length) { size = buf.length > len-i ? len-i : buf.length; if (fs.readSync(fd, buf, 0, size, null) != size) { break; } md5.update(buf.slice(0, size)); } fs.closeSync(fd); fd = 0; if (i< len) { return null; } return md5.digest('hex'); }catch(e) { if (fd) { fs.closeSync(fd); } return null; } } else { return null; } }; /** * @desc: 计算字符串的sha1值 * @return: string. */ exports.sha1 = function ( /* String */ str ) { var sha1 = crypto.createHash('sha1'); sha1.update(str); return sha1.digest('hex'); } /** * @desc: * @return:string;错误返回null. */ exports.sha1_file = function( filename ) { var stat = fs.statSync(filename); if (stat && stat.isFile() && stat.size > 0) { var fd = null; try { fd = fs.openSync(filename, 'r'); if (!fd) return 0; var buf = new Buffer(1024*10); var size; var sha1 = crypto.createHash('sha1'); for (var i = 0, len = stat.size; i < len; i+=buf.length) { size = buf.length > len-i ? len-i : buf.length; if (fs.readSync(fd, buf, 0, size, null) != size) { break; } sha1.update(buf.slice(0, size)); } fs.closeSync(fd); fd = 0; if (i< len) { return null; } return sha1.digest('hex'); }catch(e) { if (fd) { fs.closeSync(fd); } return null; } } else { return null; } }; /** * @desc: 分段计算方式. * var hash = md5_begin(); * md5_update(hash, 'xxx'); * var hex = md5_finish(hash); */ exports.md5_begin = function () { return crypto.createHash('md5'); } exports.md5_update = function (hash, /* String */ str) { hash.update(str); } exports.md5_finish = function (hash) { return hash.digest('hex'); } /** * @desc: 分段计算方式. * var hash = sha1_begin(); * sha1_update(hash, 'xxx'); * var hex = sha1_finish(hash); */ exports.sha1_begin = function () { return crypto.createHash('sha1'); } exports.sha1_update = function (hash, /* String */ str) { hash.update(str); } exports.sha1_finish = function (hash) { return hash.digest('hex'); } /** * @desc: 生成一个uuid字符串 (uuid v1 timestamp) * @return: */ exports.uuid = function () { // return uuidv4(); return cryptUUID.uuid(); } /** * @desc: base64编码. * @param arrByte: 字节数组. * @return: string. */ exports.base64_encode=crypt.base64_encode; var base64DecodeChars = new Array( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 ); /** * @desc: 使用上次的解码的数据继续进行base64解码. * @return: { c1, c2, c3, c4, data, // 字节数组 }. */ exports.base64_decode = function (strBase64, c1 = 0, c2 = 0, c3 = 0, c4 = 0){ var i=0, len = strBase64.length, out = []; while (i < len){ // c1_loop: if (c2 != -1 && c3 != -1 && c4 != -1) { do{ c1 = base64DecodeChars[strBase64.charCodeAt(i++) & 0xff] } while ( i < len && c1 == -1 ); if (c1 == -1) break; } // c2_loop: if (c3 != -1 && c4 != -1) { do{ c2 = base64DecodeChars[strBase64.charCodeAt(i++) & 0xff] } while ( i < len && c2 == -1 ); if (c2 == -1) break; out.push((c1 << 2) | ((c2 & 0x30) >> 4)); } // c3_loop: if (c4 != -1) { do{ c3 = strBase64.charCodeAt(i++) & 0xff; if (c3 == 61) return {data:out}; c3 = base64DecodeChars[c3] } while ( i < len && c3 == -1 ); if (c3 == -1) break; out.push(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); } // c4_loop: do{ c4 = strBase64.charCodeAt(i++) & 0xff; if (c4 == 61) return {data:out}; c4 = base64DecodeChars[c4] } while ( i < len && c4 == -1 ); if (c4 == -1) break; out.push(((c3 & 0x03) << 6) | c4) c1 = c2 = c3 = c4 = 0; } return {data:out,c1,c2,c3,c4}; }