fcs
2025-04-10 0163870d662dc5b7d69ceff977490ede594f7d82
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
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/**
 * Created by yang on 2015/8/25.
 */
'use strict';
 
var Buffer = require('buffer').Buffer;
 
var trimReg = /^\u0000+|\u0000+$/g;
 
module.exports = {
    /**
     * 将unsigned number转换为Big-Endian buffer
     * @param number
     * @param bytes buffer的字节数
     */
    number2Buffer: function(number, bytes) {
        if (number < 0) {
            throw new Error('"number" must greater than or equal to zero.');
        }
        bytes = bytes || 8;
        // 转换为16进制字符串
        var hex = number.toString(16);
 
        // ------- 将hex length补充成bytes x 2,不足则高位补0,超过则去掉高位
        var length = hex.length;
        var targetLength = bytes * 2;
        if (length < targetLength) {
            var i = targetLength - length;
            while (i > 0) {
                hex = '0' + hex;
                i--;
            }
 
        } else if (length > targetLength) {
            hex = hex.substring(length - targetLength);
        }
 
        // ------ 填充到buffer里,高位在前
        var buffer = new Buffer(bytes);
        var offset = 0;
        while (offset < bytes) {
            var bn = Number("0x" + hex.substring(offset * 2, (offset * 2) + 2));
            buffer.writeUInt8(bn, offset);
            offset++;
        }
 
        return buffer;
    },
 
    /**
     * 将buf转为数字
     * @param buf
     * @param offset
     * @returns {number}
     */
    buffer2Number: function(buf, offset) {
        var str = buf.toString('hex', offset, offset + 8);
        var v = parseInt(str.substring(8), 16) - parseInt(str.substring(0, 8), 16);
        if (v < 0) {
            v--;
        }
        return v;
    },
 
    /**
     * 构造Object.defineProperty中指定的property属性,并达到const声明的效果,只读,不可写
     * @param value
     * @returns {{configurable: boolean, writable: boolean, value: *}}
     */
    buildConstProp: function(value) {
        return {
            configurable: false,
            writable: false,
            value: value
        };
    },
 
    /**
     * 在String.prototype.trim的基础上再去掉\u0000
     *  默认trim的处理见下:
     *      https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/trim
     *      http://blog.stevenlevithan.com/archives/faster-trim-javascript
     *      http://jsperf.com/mega-trim-test
     * @param str
     * @returns {string}
     */
    trim: function(str) {
        return str.trim().replace(trimReg, '');
    },
 
    /**
     * file id conver to group and filename
     * @param fileId
     * @returns {{group: string, filename: string}}
     */
    id2gf: function(fileId) {
        var pos = fileId.indexOf('/');
        return {
            group: fileId.substring(0, pos),
            filename: fileId.substring(pos + 1)
        };
    }
};