17301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver/* 27301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Copyright 2012, Google Inc. 37301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * All rights reserved. 47301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 57301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Redistribution and use in source and binary forms, with or without 67301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * modification, are permitted provided that the following conditions are 77301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * met: 87301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 97301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * * Redistributions of source code must retain the above copyright 107301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * notice, this list of conditions and the following disclaimer. 117301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * * Redistributions in binary form must reproduce the above 127301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * copyright notice, this list of conditions and the following disclaimer 137301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * in the documentation and/or other materials provided with the 147301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * distribution. 157301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * * Neither the name of Google Inc. nor the names of its 167301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * contributors may be used to endorse or promote products derived from 177301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * this software without specific prior written permission. 187301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 197301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 207301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 217301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 227301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 237301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 247301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 257301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 267301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 277301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 287301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 297301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 307301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver */ 317301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 327301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverpackage org.jf.dexlib2.dexbacked; 337301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 347301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverimport org.jf.util.ExceptionWithContext; 357301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 367301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverimport javax.annotation.Nonnull; 377301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 387301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverpublic class BaseDexBuffer { 397301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver @Nonnull /* package private */ final byte[] buf; 407301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 417301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public BaseDexBuffer(@Nonnull byte[] buf) { 427301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver this.buf = buf; 437301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 447301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 457301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readSmallUint(int offset) { 467301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver byte[] buf = this.buf; 477301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver int result = (buf[offset] & 0xff) | 487301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+1] & 0xff) << 8) | 497301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+2] & 0xff) << 16) | 507301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+3]) << 24); 517301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (result < 0) { 527301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver throw new ExceptionWithContext("Encountered small uint that is out of range at offset 0x%x", offset); 537301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 547301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return result; 557301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 567301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 577301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readOptionalUint(int offset) { 587301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver byte[] buf = this.buf; 597301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver int result = (buf[offset] & 0xff) | 607301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+1] & 0xff) << 8) | 617301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+2] & 0xff) << 16) | 627301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+3]) << 24); 637301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (result < -1) { 647301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver throw new ExceptionWithContext("Encountered optional uint that is out of range at offset 0x%x", offset); 657301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 667301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return result; 677301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 687301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 697301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readUshort(int offset) { 707301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver byte[] buf = this.buf; 717301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return (buf[offset] & 0xff) | 727301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+1] & 0xff) << 8); 737301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 747301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 757301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readUbyte(int offset) { 767301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return buf[offset] & 0xff; 777301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 787301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 797301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public long readLong(int offset) { 807301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver byte[] buf = this.buf; 817301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return (buf[offset] & 0xff) | 827301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+1] & 0xff) << 8) | 837301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+2] & 0xff) << 16) | 847301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+3] & 0xffL) << 24) | 857301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+4] & 0xffL) << 32) | 867301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+5] & 0xffL) << 40) | 877301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+6] & 0xffL) << 48) | 887301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver (((long)buf[offset+7]) << 56); 897301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 907301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 917301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readInt(int offset) { 927301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver byte[] buf = this.buf; 937301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return (buf[offset] & 0xff) | 947301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+1] & 0xff) << 8) | 957301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ((buf[offset+2] & 0xff) << 16) | 967301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver (buf[offset+3] << 24); 977301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 987301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 997301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readShort(int offset) { 1007301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver byte[] buf = this.buf; 1017301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return (buf[offset] & 0xff) | 1027301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver (buf[offset+1] << 8); 1037301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 1047301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 1057301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public int readByte(int offset) { 1067301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return buf[offset]; 1077301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 1087301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 1097301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver @Nonnull 1107301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver public BaseDexReader readerAt(int offset) { 1117301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return new BaseDexReader<BaseDexBuffer>(this, offset); 1127301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 113cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver 114cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver @Nonnull 115cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver protected byte[] getBuf() { 116cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver return buf; 117cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver } 1187301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver} 119