/// <summary>Reads a string encoded in WZ format.</summary>
        /// <param name="encrypted"> Whether the string is encrypted. </param>
        /// <returns> The read string. </returns>
        internal string ReadWZString(bool encrypted = true)
        {
            if (Position + 1 > Length)
            {
                throw new WZException("WZ string offset out of bounds");
            }
            int length = ReadSByte();

            if (length == 0)
            {
                return("");
            }
            if (length > 0)
            {
                length = length == 127 ? ReadInt32WithinBounds() : length;
                if (length == 0)
                {
                    return("");
                }
                if (Position + length * 2 > Length)
                {
                    throw new WZException("Not enough bytes to read WZ string");
                }
                byte[] rbytes = ReadBytes(length * 2);
                return(_aes.DecryptUnicodeString(rbytes, encrypted));
            } // !(length >= 0), i think we can assume length < 0, but the compiler can't seem to see that
            length = length == -128 ? ReadInt32WithinBounds() : -length;
            if (Position + length > Length)
            {
                throw new WZException("Not enough bytes to read WZ string");
            }
            return(length == 0 ? "" : _aes.DecryptASCIIString(ReadBytes(length), encrypted));
        }