public static int getEndian(byte[] buf, int offset) { BaseDexBuffer bdb = new BaseDexBuffer(buf); return bdb.readInt(offset + ENDIAN_TAG_OFFSET); } }
@Nonnull public List<String> getDependencies() { final int dexOffset = OdexHeaderItem.getDexOffset(odexBuf); final int dependencyOffset = OdexHeaderItem.getDependenciesOffset(odexBuf) - dexOffset; BaseDexBuffer buf = new BaseDexBuffer(this.buf); int dependencyCount = buf.readInt(dependencyOffset + DEPENDENCY_COUNT_OFFSET); return new VariableSizeList<String>(this, dependencyOffset + DEPENDENCY_START_OFFSET, dependencyCount) { @Override protected String readNextItem(@Nonnull DexReader reader, int index) { int length = reader.readInt(); int offset = reader.getOffset(); reader.moveRelative(length + 20); try { return new String(DexBackedOdexFile.this.buf, offset, length-1, "US-ASCII"); } catch (UnsupportedEncodingException ex) { throw new RuntimeException(ex); } } }; }
public int readInt() { int o = offset; int result = dexBuf.readInt(offset); offset = o + 4; return result; }
public int readInt() { int o = offset; int result = dexBuf.readInt(offset); offset = o + 4; return result; }
public int readInt() { int o = offset; int result = dexBuf.readInt(offset); offset = o + 4; return result; }
public int readInt(int offset) { return dexBuf.readInt(offset); }
public int readInt(int offset) { return dexBuf.readInt(offset); } public int readShort(int offset) { return dexBuf.readShort(offset); }
public int readInt(int offset) { return dexBuf.readInt(offset); } public int readShort(int offset) { return dexBuf.readShort(offset); }
public static int getEndian(byte[] buf, int offset) { BaseDexBuffer bdb = new BaseDexBuffer(buf); return bdb.readInt(offset + ENDIAN_TAG_OFFSET); } }
public static int getEndian(byte[] buf, int offset) { BaseDexBuffer bdb = new BaseDexBuffer(buf); return bdb.readInt(offset + ENDIAN_TAG_OFFSET); } }
@Nonnull public List<String> getDependencies() { final int dexOffset = OdexHeaderItem.getDexOffset(odexBuf); final int dependencyOffset = OdexHeaderItem.getDependenciesOffset(odexBuf) - dexOffset; BaseDexBuffer buf = new BaseDexBuffer(this.buf); int dependencyCount = buf.readInt(dependencyOffset + DEPENDENCY_COUNT_OFFSET); return new VariableSizeList<String>(this, dependencyOffset + DEPENDENCY_START_OFFSET, dependencyCount) { @Override protected String readNextItem(@Nonnull DexReader reader, int index) { int length = reader.readInt(); int offset = reader.getOffset(); reader.moveRelative(length + 20); try { return new String(DexBackedOdexFile.this.buf, offset, length-1, "US-ASCII"); } catch (UnsupportedEncodingException ex) { throw new RuntimeException(ex); } } }; }
@Test public void testReadInt() { BaseDexBuffer dexBuf = new BaseDexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44}); Assert.assertEquals(0x44332211, dexBuf.readInt(0)); dexBuf = new BaseDexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00}); Assert.assertEquals(0, dexBuf.readInt(0)); dexBuf = new BaseDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f}); Assert.assertEquals(Integer.MAX_VALUE, dexBuf.readInt(0)); dexBuf = new BaseDexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80}); Assert.assertEquals(Integer.MIN_VALUE, dexBuf.readInt(0)); dexBuf = new BaseDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80}); Assert.assertEquals(0x80ffffff, dexBuf.readInt(0)); dexBuf = new BaseDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); Assert.assertEquals(-1, dexBuf.readInt(0)); }
int dependencyCount = buf.readInt(dependencyOffset + DEPENDENCY_COUNT_OFFSET);
@Test public void testReadRandom() { Random r = new Random(1234567890); ByteBuffer byteBuf = ByteBuffer.allocateDirect(4).order(ByteOrder.LITTLE_ENDIAN); byte[] buf = new byte[4]; BaseDexBuffer dexBuf = new BaseDexBuffer(buf); for (int i=0; i<10000; i++) { int val = r.nextInt(); byteBuf.putInt(0, val); byteBuf.position(0); byteBuf.get(buf); boolean expectException = val < 0; try { int returnedVal = dexBuf.readSmallUint(0); Assert.assertFalse(String.format("Didn't throw an exception for value: %x", val), expectException); Assert.assertEquals(val, returnedVal); } catch (Exception ex) { Assert.assertTrue(String.format("Threw an exception for value: %x", val), expectException); } Assert.assertEquals(val, dexBuf.readInt(0)); Assert.assertEquals(val & 0xFFFF, dexBuf.readUshort(0)); Assert.assertEquals((val >> 8) & 0xFFFF, dexBuf.readUshort(1)); Assert.assertEquals((val >> 16) & 0xFFFF, dexBuf.readUshort(2)); Assert.assertEquals((short)val, dexBuf.readShort(0)); Assert.assertEquals((short)(val >> 8), dexBuf.readShort(1)); Assert.assertEquals((short)(val >> 16), dexBuf.readShort(2)); } }