class Android::Dex::DexObject::StringDataItem
string_data_item @see source.android.com/devices/tech/dalvik/dex-format.html
Public Instance Methods
to_s()
click to toggle source
# File lib/android/dex/dex_object.rb, line 179 def to_s @params[:data] end
Private Instance Methods
mutf8_to_utf8(data, off, ulen)
click to toggle source
# File lib/android/dex/dex_object.rb, line 183 def mutf8_to_utf8(data, off, ulen) mi = 0 # index of mutf8 data codepoints = [] while ulen > 0 do b0 = data[off + mi].ord bu = (b0 & 0xf0) # b0's upper nibble if (b0 & 0x80) == 0 # single byte encoding (0b0xxx_xxxx) c = b0 mi += 1 ulen -= 1 elsif bu == 0xc0 || bu == 0xd0 # two-byte encoding (0b110x_xxxx) b1 = data[off + mi + 1].ord c = (b0 & 0x1f) << 6 | (b1 & 0x3f) mi += 2 ulen -= 1 elsif bu == 0xe0 # three-byte encoding (0b1110_xxxx) b1 = data[off + mi + 1].ord b2 = data[off + mi + 2].ord c = (b0 & 0x0f) << 12 | (b1 & 0x3f) << 6 | (b2 & 0x3f) mi += 3 ulen -= 1 if 0xD800 <= c && c <= 0xDBFF # this must be a surrogate pair b4 = data[off + mi + 1].ord b5 = data[off + mi + 2].ord c = ((b1 & 0x0f) + 1) << 16 | (b2 & 0x3f) << 10 | (b4 & 0x0f) << 6 | (b5 & 0x3f) mi += 3 ulen -= 1 end else STDERR.puts "unsupported byte: 0x#{'%02X' % b0} @#{mi}" c = 0 mi += 1 next end if c != 0 codepoints << c end end codepoints.pack("U*") end
parse()
click to toggle source
# File lib/android/dex/dex_object.rb, line 223 def parse @params[:utf16_size] = read_uleb @params[:data] = mutf8_to_utf8(@data, @offset + @parsing_off, @params[:utf16_size]) end