diff --git a/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java b/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java index 4b1836eb..c2b892ad 100644 --- a/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/StringDataItem.java @@ -78,12 +78,12 @@ public class StringDataItem extends Item { public static StringDataItem lookupStringDataItem(DexFile dexFile, String value) { StringDataItem StringDataItem = new StringDataItem(dexFile, value); return dexFile.StringDataSection.getInternedItem(StringDataItem); - } + } /** {@inheritDoc} */ protected void readItem(Input in, ReadContext readContext) { in.readUnsignedLeb128(); //string length - stringValue = Utf8Utils.utf8BytesToString(in.readNullTerminatedBytes()); + stringValue = in.realNullTerminatedUtf8String(); } /** {@inheritDoc} */ diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayInput.java b/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayInput.java index 6fc1a354..ae6bfea1 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayInput.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayInput.java @@ -296,7 +296,7 @@ public class ByteArrayInput } /** {@inheritDoc} */ - public byte[] readNullTerminatedBytes() { + public String realNullTerminatedUtf8String() { int startPosition = cursor; while (data[cursor] != 0) { cursor++; @@ -305,12 +305,11 @@ public class ByteArrayInput } } int byteCount = cursor - startPosition; + //skip the terminating null cursor++; - byte[] result = new byte[byteCount]; - System.arraycopy(data, startPosition, result, 0, byteCount); - return result; + return Utf8Utils.utf8BytesToString(data, startPosition, byteCount); } /** {@inheritDoc} */ diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/Input.java b/dexlib/src/main/java/org/jf/dexlib/Util/Input.java index 160ececa..e1f07a45 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/Input.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/Input.java @@ -132,11 +132,13 @@ public interface Input { public byte[] readBytes(int length); /** - * reads a byte[] from this instance, from the current cursor up to but not including + * reads and decodes a null terminated utf8 string from the current cursor up to but not including * the next null (0) byte. The terminating null byte is read and discarded, so that after the read, * the cursor is positioned at the byte immediately after the terminating null + * + * @return a string representing the decoded value */ - public byte[] readNullTerminatedBytes(); + public String realNullTerminatedUtf8String(); /** * Skips the given number of bytes. diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/Utf8Utils.java b/dexlib/src/main/java/org/jf/dexlib/Util/Utf8Utils.java index cc18ea7d..3086f77c 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/Utf8Utils.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/Utf8Utils.java @@ -68,17 +68,18 @@ public final class Utf8Utils { * This method uses a global buffer to avoid having to allocate one every time, so it is *not* thread-safe * * @param bytes non-null; the bytes to convert + * @param start the start index of the utf8 string to convert + * @param length the length of the utf8 string to convert, not including any null-terminator that might be present * @return non-null; the converted string */ - public static String utf8BytesToString(byte[] bytes) { - int length = bytes.length; + public static String utf8BytesToString(byte[] bytes, int start, int length) { if (tempBuffer == null || tempBuffer.length < length) { tempBuffer = new char[length]; } char[] chars = tempBuffer; int outAt = 0; - for (int at = 0; length > 0; /*at*/) { + for (int at = start; length > 0; /*at*/) { int v0 = bytes[at] & 0xFF; char out; switch (v0 >> 4) {