* Performs decode on given content. * @protected * @param {Chain} content * @return {number[]|string|Uint8Array|Chain|Promise} Decoded content
(content)
| 153 | * @return {number[]|string|Uint8Array|Chain|Promise} Decoded content |
| 154 | */ |
| 155 | performDecode (content) { |
| 156 | const typeName = this.getSettingValue('type') |
| 157 | const typeIndex = typeNames.indexOf(typeName) |
| 158 | const bytesPerInteger = typeBytes[typeIndex] |
| 159 | const isBigEndian = this.getSettingValue('byteOrder') === 'big-endian' |
| 160 | |
| 161 | // Read integers from string |
| 162 | const format = this.getSettingValue('format') |
| 163 | const integerStrings = content.getString().split(/\s+/) |
| 164 | const integers = this.createIntegerTypeArray( |
| 165 | integerStrings.length, typeName) |
| 166 | |
| 167 | let i, integer, integerString |
| 168 | for (i = 0; i < integerStrings.length; i++) { |
| 169 | // Interpret empty integer strings as empty integers |
| 170 | integerString = integerStrings[i] |
| 171 | if (integerString === '') { |
| 172 | integerString = '0' |
| 173 | } |
| 174 | |
| 175 | // Read format |
| 176 | switch (format) { |
| 177 | case 'binary': |
| 178 | integer = parseInt(integerString, 2) |
| 179 | break |
| 180 | case 'octal': |
| 181 | integer = parseInt(integerString, 8) |
| 182 | break |
| 183 | case 'decimal': |
| 184 | integer = parseInt(integerString, 10) |
| 185 | break |
| 186 | default: |
| 187 | integer = parseInt(integerString, 16) |
| 188 | } |
| 189 | |
| 190 | // Check if integer is valid |
| 191 | if (isNaN(integer)) { |
| 192 | throw new InvalidInputError( |
| 193 | `Invalid integer '${integerString}' at index ${i}`) |
| 194 | } |
| 195 | integers[i] = integer |
| 196 | } |
| 197 | |
| 198 | // Write bytes |
| 199 | const bytes = new Uint8Array(integers.length * bytesPerInteger) |
| 200 | let integerByte |
| 201 | for (i = 0; i < bytes.length; i++) { |
| 202 | integer = integers[parseInt(i / bytesPerInteger)] |
| 203 | integerByte = isBigEndian |
| 204 | ? bytesPerInteger - i % bytesPerInteger - 1 |
| 205 | : i % bytesPerInteger |
| 206 | bytes[i] = (integer >> (integerByte * 8)) & 0xff |
| 207 | } |
| 208 | |
| 209 | return bytes |
| 210 | } |
| 211 | |
| 212 | /** |
nothing calls this directly
no test coverage detected