throw InvalidProtocolBufferException.invalidUtf8(); throw InvalidProtocolBufferException.invalidUtf8(); } else { if (offset >= limit - 2) { throw InvalidProtocolBufferException.invalidUtf8();
private static void handleTwoBytes( byte byte1, byte byte2, char[] resultArr, int resultPos) throws InvalidProtocolBufferException { // Simultaneously checks for illegal trailing-byte in leading position (<= '11000000') and // overlong 2-byte, '11000001'. if (byte1 < (byte) 0xC2 || isNotTrailingByte(byte2)) { throw InvalidProtocolBufferException.invalidUtf8(); } resultArr[resultPos] = (char) (((byte1 & 0x1F) << 6) | trailingByteValue(byte2)); }
throw InvalidProtocolBufferException.invalidUtf8(); throw InvalidProtocolBufferException.invalidUtf8(); } else { if (offset >= limit - 2) { throw InvalidProtocolBufferException.invalidUtf8();
private static void handleThreeBytes( byte byte1, byte byte2, byte byte3, char[] resultArr, int resultPos) throws InvalidProtocolBufferException { if (isNotTrailingByte(byte2) // overlong? 5 most significant bits must not all be zero || (byte1 == (byte) 0xE0 && byte2 < (byte) 0xA0) // check for illegal surrogate codepoints || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0) || isNotTrailingByte(byte3)) { throw InvalidProtocolBufferException.invalidUtf8(); } resultArr[resultPos] = (char) (((byte1 & 0x0F) << 12) | (trailingByteValue(byte2) << 6) | trailingByteValue(byte3)); }
@Override public String readStringRequireUtf8() throws IOException { final int size = readRawVarint32(); if (size > 0 && size <= (limit - pos)) { if (ENABLE_CUSTOM_UTF8_DECODE) { String result = Utf8.decodeUtf8(buffer, pos, size); pos += size; return result; } else { // TODO(martinrb): We could save a pass by validating while decoding. if (!Utf8.isValidUtf8(buffer, pos, pos + size)) { throw InvalidProtocolBufferException.invalidUtf8(); } final int tempPos = pos; pos += size; return new String(buffer, tempPos, size, UTF_8); } } if (size == 0) { return ""; } if (size <= 0) { throw InvalidProtocolBufferException.negativeSize(); } throw InvalidProtocolBufferException.truncatedMessage(); }
throw InvalidProtocolBufferException.invalidUtf8();
throw InvalidProtocolBufferException.invalidUtf8(); throw InvalidProtocolBufferException.invalidUtf8(); } else { if (address >= addressLimit - 2) { throw InvalidProtocolBufferException.invalidUtf8();
UnsafeUtil.copyMemory(currentByteBufferPos, bytes, 0, size); if (!Utf8.isValidUtf8(bytes)) { throw InvalidProtocolBufferException.invalidUtf8(); } else { if (!Utf8.isValidUtf8(bytes)) { throw InvalidProtocolBufferException.invalidUtf8();
throw InvalidProtocolBufferException.invalidUtf8(); throw InvalidProtocolBufferException.invalidUtf8(); } else { if (offset >= limit - 2) { throw InvalidProtocolBufferException.invalidUtf8();
throw InvalidProtocolBufferException.invalidUtf8();
private static void handleFourBytes( byte byte1, byte byte2, byte byte3, byte byte4, char[] resultArr, int resultPos) throws InvalidProtocolBufferException{ if (isNotTrailingByte(byte2) // Check that 1 <= plane <= 16. Tricky optimized form of: // valid 4-byte leading byte? // if (byte1 > (byte) 0xF4 || // overlong? 4 most significant bits must not all be zero // byte1 == (byte) 0xF0 && byte2 < (byte) 0x90 || // codepoint larger than the highest code point (U+10FFFF)? // byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F) || (((byte1 << 28) + (byte2 - (byte) 0x90)) >> 30) != 0 || isNotTrailingByte(byte3) || isNotTrailingByte(byte4)) { throw InvalidProtocolBufferException.invalidUtf8(); } int codepoint = ((byte1 & 0x07) << 18) | (trailingByteValue(byte2) << 12) | (trailingByteValue(byte3) << 6) | trailingByteValue(byte4); resultArr[resultPos] = DecodeUtil.highSurrogate(codepoint); resultArr[resultPos + 1] = DecodeUtil.lowSurrogate(codepoint); }
/** * Read a {@code string} field value from the stream. * If the stream contains malformed UTF-8, * throw exception {@link InvalidProtocolBufferException}. */ public String readStringRequireUtf8() throws IOException { final int size = readRawVarint32(); final byte[] bytes; int pos = bufferPos; if (size <= (bufferSize - pos) && size > 0) { // Fast path: We already have the bytes in a contiguous buffer, so // just copy directly from it. bytes = buffer; bufferPos = pos + size; } else if (size == 0) { return ""; } else { // Slow path: Build a byte array first then copy it. bytes = readRawBytesSlowPath(size); pos = 0; } // TODO(martinrb): We could save a pass by validating while decoding. if (!Utf8.isValidUtf8(bytes, pos, pos + size)) { throw InvalidProtocolBufferException.invalidUtf8(); } return new String(bytes, pos, size, "UTF-8"); }
throw InvalidProtocolBufferException.invalidUtf8();
throw InvalidProtocolBufferException.invalidUtf8();