parse static method
Parses the provided uuid
into a list of byte values as a List
Can optionally be provided a buffer
to write into and
a positional offset
for where to start inputting into the buffer.
Returns the buffer containing the bytes. If no buffer was provided, a new buffer is created and returned. If a buffer was provided, it is returned (even if the uuid bytes are not placed at the beginning of that buffer).
Throws FormatException if the UUID is invalid. Optionally you can set
validate
to false to disable validation of the UUID before parsing.
Throws RangeError if a buffer is provided and it is too small. It is also thrown if a non-zero offset is provided without providing a buffer.
Implementation
static List<int> parse(
String uuid, {
List<int>? buffer,
int offset = 0,
bool validate = true,
ValidationMode validationMode = ValidationMode.strictRFC4122,
}) {
if (validate) {
isValidOrThrow(fromString: uuid, validationMode: validationMode);
}
var i = offset, ii = 0;
// Get buffer to store the result
if (buffer == null) {
// Buffer not provided: create a 16 item buffer
if (offset != 0) {
throw RangeError('non-zero offset without providing a buffer');
}
buffer = Uint8List(16);
} else {
// Buffer provided: check it is large enough
if (buffer.length - offset < 16) {
throw RangeError('buffer too small: need 16: length=${buffer.length}'
'${offset != 0 ? ', offset=$offset' : ''}');
}
}
// Convert to lowercase and replace all hex with bytes then
// string.replaceAll() does a lot of work that I don't need, and a manual
// regex gives me more control.
final regex = RegExp('[0-9a-f]{2}');
for (Match match in regex.allMatches(uuid.toLowerCase())) {
if (ii < 16) {
var hex = uuid.toLowerCase().substring(match.start, match.end);
buffer[i + ii++] = int.parse(hex, radix: 16);
}
}
// Zero out any left over bytes if the string was too short.
while (ii < 16) {
buffer[i + ii++] = 0;
}
return buffer;
}