Utf16leBytesToCodeUnitsDecoder class
Convert UTF-16LE encoded bytes to utf16 code units by grouping 1-2 bytes to produce the code unit (0-(2^16)-1).
class Utf16leBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder { Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [ int offset = 0, int length, bool stripBom = true, int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) : super._fromListRangeIterator((new _ListRange(utf16EncodedBytes, offset, length)).iterator(), replacementCodepoint) { if (stripBom && hasUtf16leBom(utf16EncodedBytes, offset, length)) { skip(); } } int decode() { int lo = utf16EncodedBytesIterator.next(); int hi = utf16EncodedBytesIterator.next(); return (hi << 8) + lo; } }
Extends
Utf16BytesToCodeUnitsDecoder > Utf16leBytesToCodeUnitsDecoder
Constructors
new Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [int offset = 0, int length, bool stripBom = true, int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) #
Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [ int offset = 0, int length, bool stripBom = true, int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) : super._fromListRangeIterator((new _ListRange(utf16EncodedBytes, offset, length)).iterator(), replacementCodepoint) { if (stripBom && hasUtf16leBom(utf16EncodedBytes, offset, length)) { skip(); } }
Properties
final int position #
int get position => utf16EncodedBytesIterator.position ~/ 2;
final int remaining #
int get remaining => (utf16EncodedBytesIterator.remaining + 1) ~/ 2;
final int replacementCodepoint #
final int replacementCodepoint;
final _ListRangeIterator utf16EncodedBytesIterator #
final _ListRangeIterator utf16EncodedBytesIterator;
Methods
void backup([int by = 1]) #
void backup([int by = 1]) { utf16EncodedBytesIterator.backup(2 * by); }
int decode() #
int decode() { int lo = utf16EncodedBytesIterator.next(); int hi = utf16EncodedBytesIterator.next(); return (hi << 8) + lo; }
List<int> decodeRest() #
Provides a fast way to decode the rest of the source bytes in a single call. This method trades memory for improved speed in that it potentially over-allocates the List containing results.
List<int> decodeRest() { List<int> codeunits = new List<int>(remaining); int i = 0; while (hasNext()) { codeunits[i++] = next(); } if (i == codeunits.length) { return codeunits; } else { List<int> truncCodeunits = new List<int>(i); truncCodeunits.setRange(0, i, codeunits); return truncCodeunits; } }
bool hasNext() #
int next() #
Gets the next element in the iteration. Throws a
NoMoreElementsException
if no element is left.
int next() { if (utf16EncodedBytesIterator.remaining < 2) { utf16EncodedBytesIterator.next(); if (replacementCodepoint != null) { return replacementCodepoint; } else { throw new ArgumentError( "Invalid UTF16 at ${utf16EncodedBytesIterator.position}"); } } else { return decode(); } }
void skip([int count = 1]) #
void skip([int count = 1]) { utf16EncodedBytesIterator.skip(2 * count); }