numbers.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const { Buffer } = require('buffer')
  2. const max = 65536
  3. const cache = {}
  4. // in node 6 Buffer.subarray returns a Uint8Array instead of a Buffer
  5. // later versions return a Buffer
  6. // alternative is Buffer.slice but that creates a new buffer
  7. // creating new buffers takes time
  8. // SubOk is only false on node < 8
  9. const SubOk = Buffer.isBuffer(Buffer.from([1, 2]).subarray(0, 1))
  10. function generateBuffer (i) {
  11. const buffer = Buffer.allocUnsafe(2)
  12. buffer.writeUInt8(i >> 8, 0)
  13. buffer.writeUInt8(i & 0x00FF, 0 + 1)
  14. return buffer
  15. }
  16. function generateCache () {
  17. for (let i = 0; i < max; i++) {
  18. cache[i] = generateBuffer(i)
  19. }
  20. }
  21. function genBufVariableByteInt (num) {
  22. const maxLength = 4 // max 4 bytes
  23. let digit = 0
  24. let pos = 0
  25. const buffer = Buffer.allocUnsafe(maxLength)
  26. do {
  27. digit = num % 128 | 0
  28. num = num / 128 | 0
  29. if (num > 0) digit = digit | 0x80
  30. buffer.writeUInt8(digit, pos++)
  31. } while (num > 0 && pos < maxLength)
  32. if (num > 0) {
  33. pos = 0
  34. }
  35. return SubOk ? buffer.subarray(0, pos) : buffer.slice(0, pos)
  36. }
  37. function generate4ByteBuffer (num) {
  38. const buffer = Buffer.allocUnsafe(4)
  39. buffer.writeUInt32BE(num, 0)
  40. return buffer
  41. }
  42. module.exports = {
  43. cache,
  44. generateCache,
  45. generateNumber: generateBuffer,
  46. genBufVariableByteInt,
  47. generate4ByteBuffer
  48. }