@Override public int encodedSize(String value) { return (int) Utf8.size(value); }
public void dumpStringData(String s) throws IOException { System.out.println(" " + s); System.out.println(" String.length: " + s.length()); System.out.println("String.codePointCount: " + s.codePointCount(0, s.length())); System.out.println(" Utf8.size: " + Utf8.size(s)); System.out.println(" UTF-8 bytes: " + ByteString.encodeUtf8(s).hex()); System.out.println(); }
@Test public void sizeWithBounds() throws Exception { assertEquals(0, Utf8.size("", 0, 0)); assertEquals(0, Utf8.size("abc", 0, 0)); assertEquals(1, Utf8.size("abc", 1, 2)); assertEquals(2, Utf8.size("abc", 0, 2)); assertEquals(3, Utf8.size("abc", 0, 3)); assertEquals(16, Utf8.size("təˈranəˌsôr", 0, 11)); assertEquals(5, Utf8.size("təˈranəˌsôr", 3, 7)); }
public static ByteString encodeQuery(String host, int type) { Buffer buf = new Buffer(); buf.writeShort(0); // query id buf.writeShort(256); // flags with recursion buf.writeShort(1); // question count buf.writeShort(0); // answerCount buf.writeShort(0); // authorityResourceCount buf.writeShort(0); // additional Buffer nameBuf = new Buffer(); final String[] labels = host.split("\\."); for (String label : labels) { long utf8ByteCount = Utf8.size(label); if (utf8ByteCount != label.length()) { throw new IllegalArgumentException("non-ascii hostname: " + host); } nameBuf.writeByte((byte) utf8ByteCount); nameBuf.writeUtf8(label); } nameBuf.writeByte(0); // end nameBuf.copyTo(buf, 0, nameBuf.size()); buf.writeShort(type); buf.writeShort(1); // CLASS_IN return buf.readByteString(); }
@Test public void sizeBoundsCheck() throws Exception { try { Utf8.size(null, 0, 0); fail(); } catch (IllegalArgumentException expected) { } try { Utf8.size("abc", -1, 2); fail(); } catch (IllegalArgumentException expected) { } try { Utf8.size("abc", 2, 1); fail(); } catch (IllegalArgumentException expected) { } try { Utf8.size("abc", 1, 4); fail(); } catch (IllegalArgumentException expected) { } }
private void assertUtf8(String string, String expectedHex) throws IOException { Buffer buffer = new Buffer(); ProtoWriter writer = new ProtoWriter(buffer); writer.writeString(string); assertThat(buffer.readByteString().hex()).isEqualTo(expectedHex); assertThat(Utf8.size(string)).isEqualTo(expectedHex.length() / 2); } }
private void assertStringEncoded(String hex, String string) throws Exception { ByteString expectedUtf8 = ByteString.decodeHex(hex); // Confirm our expectations are consistent with the platform. ByteString platformUtf8 = ByteString.of(string.getBytes("UTF-8")); assertEquals(expectedUtf8, platformUtf8); // Confirm our implementation matches those expectations. ByteString actualUtf8 = new Buffer().writeUtf8(string).readByteString(); assertEquals(expectedUtf8, actualUtf8); // Confirm we are consistent when writing one code point at a time. Buffer bufferUtf8 = new Buffer(); for (int i = 0; i < string.length(); ) { int c = string.codePointAt(i); bufferUtf8.writeUtf8CodePoint(c); i += Character.charCount(c); } assertEquals(expectedUtf8, bufferUtf8.readByteString()); // Confirm we are consistent when measuring lengths. assertEquals(expectedUtf8.size(), Utf8.size(string)); assertEquals(expectedUtf8.size(), Utf8.size(string, 0, string.length())); } }
public static ByteString encodeQuery(String host, int type) { Buffer buf = new Buffer(); buf.writeShort(0); // query id buf.writeShort(256); // flags with recursion buf.writeShort(1); // question count buf.writeShort(0); // answerCount buf.writeShort(0); // authorityResourceCount buf.writeShort(0); // additional Buffer nameBuf = new Buffer(); final String[] labels = host.split("\\."); for (String label : labels) { long utf8ByteCount = Utf8.size(label); if (utf8ByteCount != label.length()) { throw new IllegalArgumentException("non-ascii hostname: " + host); } nameBuf.writeByte((byte) utf8ByteCount); nameBuf.writeUtf8(label); } nameBuf.writeByte(0); // end nameBuf.copyTo(buf, 0, nameBuf.size()); buf.writeShort(type); buf.writeShort(1); // CLASS_IN return buf.readByteString(); }