44 lines
1.2 KiB
JavaScript
44 lines
1.2 KiB
JavaScript
|
const Mode = require('./mode')
|
||
|
|
||
|
function NumericData (data) {
|
||
|
this.mode = Mode.NUMERIC
|
||
|
this.data = data.toString()
|
||
|
}
|
||
|
|
||
|
NumericData.getBitsLength = function getBitsLength (length) {
|
||
|
return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)
|
||
|
}
|
||
|
|
||
|
NumericData.prototype.getLength = function getLength () {
|
||
|
return this.data.length
|
||
|
}
|
||
|
|
||
|
NumericData.prototype.getBitsLength = function getBitsLength () {
|
||
|
return NumericData.getBitsLength(this.data.length)
|
||
|
}
|
||
|
|
||
|
NumericData.prototype.write = function write (bitBuffer) {
|
||
|
let i, group, value
|
||
|
|
||
|
// The input data string is divided into groups of three digits,
|
||
|
// and each group is converted to its 10-bit binary equivalent.
|
||
|
for (i = 0; i + 3 <= this.data.length; i += 3) {
|
||
|
group = this.data.substr(i, 3)
|
||
|
value = parseInt(group, 10)
|
||
|
|
||
|
bitBuffer.put(value, 10)
|
||
|
}
|
||
|
|
||
|
// If the number of input digits is not an exact multiple of three,
|
||
|
// the final one or two digits are converted to 4 or 7 bits respectively.
|
||
|
const remainingNum = this.data.length - i
|
||
|
if (remainingNum > 0) {
|
||
|
group = this.data.substr(i)
|
||
|
value = parseInt(group, 10)
|
||
|
|
||
|
bitBuffer.put(value, remainingNum * 3 + 1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = NumericData
|