UNPKG

@foxglove/rosmsg-serialization

Version:

ROS 1 message serialization, for reading and writing bags and network messages

40 lines 1.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.stringLengthUtf8 = stringLengthUtf8; /** * Returns the number of bytes that would be used when encoding the string as UTF-8, effectively the * same as `new TextEncoder().encode(str).length` but faster. * https://jsbench.me/nzlrkwmeiq/1 */ function stringLengthUtf8(str) { let byteLength = 0; const numCodeUnits = str.length; for (let i = 0; i < numCodeUnits; i++) { const codeUnit = str.charCodeAt(i); // 0x0000-0xFFFF if (codeUnit <= 0x7f) { byteLength += 1; // 0b0xxxxxxx } else if (codeUnit <= 0x7ff) { byteLength += 2; // 0b110xxxxx 0b10xxxxxx } else if (0xd800 <= codeUnit && codeUnit <= 0xdbff) { // If the input string is valid UTF-16 then these surrogate characters come in pairs. They // represent code points in the range 0x100000-0x10ffff and are represented with 4 bytes in // UTF-8. const nextCodeUnit = str.charCodeAt(i + 1); if (0xdc00 <= nextCodeUnit && nextCodeUnit <= 0xdfff) { byteLength += 4; // 0b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx i++; } else { byteLength += 3; // 0b1110xxxx 0b10xxxxxx 0b10xxxxxx } } else { // <= 0xFFFF byteLength += 3; // 0b1110xxxx 0b10xxxxxx 0b10xxxxxx } } return byteLength; } //# sourceMappingURL=stringLengthUtf8.js.map