mirror of
https://github.com/JasonYANG170/IOTConnect-Web.git
synced 2024-11-27 14:16:34 +00:00
60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
|
const { Buffer } = require('buffer')
|
||
|
const max = 65536
|
||
|
const cache = {}
|
||
|
|
||
|
// in node 6 Buffer.subarray returns a Uint8Array instead of a Buffer
|
||
|
// later versions return a Buffer
|
||
|
// alternative is Buffer.slice but that creates a new buffer
|
||
|
// creating new buffers takes time
|
||
|
// SubOk is only false on node < 8
|
||
|
const SubOk = Buffer.isBuffer(Buffer.from([1, 2]).subarray(0, 1))
|
||
|
|
||
|
function generateBuffer (i) {
|
||
|
const buffer = Buffer.allocUnsafe(2)
|
||
|
buffer.writeUInt8(i >> 8, 0)
|
||
|
buffer.writeUInt8(i & 0x00FF, 0 + 1)
|
||
|
|
||
|
return buffer
|
||
|
}
|
||
|
|
||
|
function generateCache () {
|
||
|
for (let i = 0; i < max; i++) {
|
||
|
cache[i] = generateBuffer(i)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function genBufVariableByteInt (num) {
|
||
|
const maxLength = 4 // max 4 bytes
|
||
|
let digit = 0
|
||
|
let pos = 0
|
||
|
const buffer = Buffer.allocUnsafe(maxLength)
|
||
|
|
||
|
do {
|
||
|
digit = num % 128 | 0
|
||
|
num = num / 128 | 0
|
||
|
if (num > 0) digit = digit | 0x80
|
||
|
|
||
|
buffer.writeUInt8(digit, pos++)
|
||
|
} while (num > 0 && pos < maxLength)
|
||
|
|
||
|
if (num > 0) {
|
||
|
pos = 0
|
||
|
}
|
||
|
|
||
|
return SubOk ? buffer.subarray(0, pos) : buffer.slice(0, pos)
|
||
|
}
|
||
|
|
||
|
function generate4ByteBuffer (num) {
|
||
|
const buffer = Buffer.allocUnsafe(4)
|
||
|
buffer.writeUInt32BE(num, 0)
|
||
|
return buffer
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
cache,
|
||
|
generateCache,
|
||
|
generateNumber: generateBuffer,
|
||
|
genBufVariableByteInt,
|
||
|
generate4ByteBuffer
|
||
|
}
|