encodeDataRaw encodes data in dataMode. The encoded data is appended to encoded.
(data []byte, dataMode dataMode, encoded *bitset.Bitset)
| 320 | // encodeDataRaw encodes data in dataMode. The encoded data is appended to |
| 321 | // encoded. |
| 322 | func (d *dataEncoder) encodeDataRaw(data []byte, dataMode dataMode, encoded *bitset.Bitset) { |
| 323 | modeIndicator := d.modeIndicator(dataMode) |
| 324 | charCountBits := d.charCountBits(dataMode) |
| 325 | |
| 326 | // Append mode indicator. |
| 327 | encoded.Append(modeIndicator) |
| 328 | |
| 329 | // Append character count. |
| 330 | encoded.AppendUint32(uint32(len(data)), charCountBits) |
| 331 | |
| 332 | // Append data. |
| 333 | switch dataMode { |
| 334 | case dataModeNumeric: |
| 335 | for i := 0; i < len(data); i += 3 { |
| 336 | charsRemaining := len(data) - i |
| 337 | |
| 338 | var value uint32 |
| 339 | bitsUsed := 1 |
| 340 | |
| 341 | for j := 0; j < charsRemaining && j < 3; j++ { |
| 342 | value *= 10 |
| 343 | value += uint32(data[i+j] - 0x30) |
| 344 | bitsUsed += 3 |
| 345 | } |
| 346 | encoded.AppendUint32(value, bitsUsed) |
| 347 | } |
| 348 | case dataModeAlphanumeric: |
| 349 | for i := 0; i < len(data); i += 2 { |
| 350 | charsRemaining := len(data) - i |
| 351 | |
| 352 | var value uint32 |
| 353 | for j := 0; j < charsRemaining && j < 2; j++ { |
| 354 | value *= 45 |
| 355 | value += encodeAlphanumericCharacter(data[i+j]) |
| 356 | } |
| 357 | |
| 358 | bitsUsed := 6 |
| 359 | if charsRemaining > 1 { |
| 360 | bitsUsed = 11 |
| 361 | } |
| 362 | |
| 363 | encoded.AppendUint32(value, bitsUsed) |
| 364 | } |
| 365 | case dataModeByte: |
| 366 | for _, b := range data { |
| 367 | encoded.AppendByte(b, 8) |
| 368 | } |
| 369 | } |
| 370 | } |
| 371 | |
| 372 | // modeIndicator returns the segment header bits for a segment of type dataMode. |
| 373 | func (d *dataEncoder) modeIndicator(dataMode dataMode) *bitset.Bitset { |