1 |
|
2 |
|
3 | var MAXBUFLEN = 8192;
|
4 |
|
5 | exports.writeString = writeString;
|
6 | exports.readString = readString;
|
7 | exports.byteLength = byteLength;
|
8 | exports.copy = copy;
|
9 | exports.writeUint64BE = writeUint64BE;
|
10 | exports.writeInt64BE = writeInt64BE;
|
11 |
|
12 |
|
13 |
|
14 | function writeString(string, start) {
|
15 | var buffer = this;
|
16 | var index = start || 0;
|
17 | var length = string.length;
|
18 |
|
19 |
|
20 | for (var i = 0; i < length; i++) {
|
21 | var chr = string.charCodeAt(i);
|
22 | if (chr < 0x80) {
|
23 | buffer[index++] = chr;
|
24 | } else if (chr < 0x800) {
|
25 | buffer[index++] = 0xC0 | (chr >> 6);
|
26 | buffer[index++] = 0x80 | (chr & 0x3F);
|
27 | } else {
|
28 | buffer[index++] = 0xE0 | (chr >> 12);
|
29 | buffer[index++] = 0x80 | ((chr >> 6) & 0x3F);
|
30 | buffer[index++] = 0x80 | (chr & 0x3F);
|
31 | }
|
32 | }
|
33 | return index - start;
|
34 | }
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | function readString(start, end) {
|
40 | var buffer = this;
|
41 | var index = start - 0 || 0;
|
42 | if (!end) end = buffer.length;
|
43 | var size = end - start;
|
44 | if (size > MAXBUFLEN) size = MAXBUFLEN;
|
45 | var out = [];
|
46 | for (; index < end;) {
|
47 | var array = new Array(size);
|
48 | for (var pos = 0; pos < size && index < end;) {
|
49 | var chr = buffer[index++];
|
50 | chr = (chr < 0x80) ? chr :
|
51 | (chr < 0xE0) ? (((chr & 0x3F) << 6) | (buffer[index++] & 0x3F)) :
|
52 | (((chr & 0x3F) << 12) | ((buffer[index++] & 0x3F) << 6) | ((buffer[index++] & 0x3F)));
|
53 | array[pos++] = chr;
|
54 | }
|
55 | if (pos < size) array = array.slice(0, pos);
|
56 | out.push(String.fromCharCode.apply("", array));
|
57 | }
|
58 | return (out.length > 1) ? out.join("") : out.length ? out.shift() : "";
|
59 | }
|
60 |
|
61 |
|
62 |
|
63 | function byteLength(string) {
|
64 | var length = 0 | 0;
|
65 | Array.prototype.forEach.call(string, function(chr) {
|
66 | var code = chr.charCodeAt(0);
|
67 | length += (code < 0x80) ? 1 : (code < 0x800) ? 2 : 3;
|
68 | });
|
69 | return length;
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 | function copy(target, targetStart, start, end) {
|
75 | var i;
|
76 | if (!start) start = 0;
|
77 | if (!end && end !== 0) end = this.length;
|
78 | if (!targetStart) targetStart = 0;
|
79 | var len = end - start;
|
80 |
|
81 | if (target === this && start < targetStart && targetStart < end) {
|
82 |
|
83 | for (i = len - 1; i >= 0; i--) {
|
84 | target[i + targetStart] = this[i + start];
|
85 | }
|
86 | } else {
|
87 |
|
88 | for (i = 0; i < len; i++) {
|
89 | target[i + targetStart] = this[i + start];
|
90 | }
|
91 | }
|
92 |
|
93 | return len;
|
94 | }
|
95 |
|
96 | function writeUint64BE(value, offset) {
|
97 | for (var i = 7; i >= 0; i--) {
|
98 | this[offset + i] = value & 0xFF;
|
99 | value /= 256;
|
100 | }
|
101 | }
|
102 |
|
103 | function writeInt64BE(value, offset) {
|
104 | if (value > 0) return writeUint64BE.call(this, value, offset);
|
105 | value++;
|
106 | for (var i = 7; i >= 0; i--) {
|
107 | this[offset + i] = ((-value) & 0xFF) ^ 0xFF;
|
108 | value /= 256;
|
109 | }
|
110 | }
|