319 lines
8.9 KiB
Java
319 lines
8.9 KiB
Java
package okio;
|
|
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.charset.Charset;
|
|
import java.util.Arrays;
|
|
|
|
/* loaded from: classes2.dex */
|
|
final class SegmentedByteString extends ByteString {
|
|
final transient int[] directory;
|
|
final transient byte[][] segments;
|
|
|
|
SegmentedByteString(Buffer buffer, int i) {
|
|
super(null);
|
|
Util.checkOffsetAndCount(buffer.size, 0L, i);
|
|
int i2 = 0;
|
|
Segment segment = buffer.head;
|
|
int i3 = 0;
|
|
int i4 = 0;
|
|
while (i3 < i) {
|
|
int i5 = segment.limit;
|
|
int i6 = segment.pos;
|
|
if (i5 == i6) {
|
|
throw new AssertionError("s.limit == s.pos");
|
|
}
|
|
i3 += i5 - i6;
|
|
i4++;
|
|
segment = segment.next;
|
|
}
|
|
this.segments = new byte[i4][];
|
|
this.directory = new int[i4 * 2];
|
|
Segment segment2 = buffer.head;
|
|
int i7 = 0;
|
|
while (i2 < i) {
|
|
this.segments[i7] = segment2.data;
|
|
i2 += segment2.limit - segment2.pos;
|
|
if (i2 > i) {
|
|
i2 = i;
|
|
}
|
|
int[] iArr = this.directory;
|
|
iArr[i7] = i2;
|
|
iArr[this.segments.length + i7] = segment2.pos;
|
|
segment2.shared = true;
|
|
i7++;
|
|
segment2 = segment2.next;
|
|
}
|
|
}
|
|
|
|
private int segment(int i) {
|
|
int binarySearch = Arrays.binarySearch(this.directory, 0, this.segments.length, i + 1);
|
|
return binarySearch >= 0 ? binarySearch : ~binarySearch;
|
|
}
|
|
|
|
private ByteString toByteString() {
|
|
return new ByteString(toByteArray());
|
|
}
|
|
|
|
private Object writeReplace() {
|
|
return toByteString();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteBuffer asByteBuffer() {
|
|
return ByteBuffer.wrap(toByteArray()).asReadOnlyBuffer();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String base64() {
|
|
return toByteString().base64();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String base64Url() {
|
|
return toByteString().base64Url();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public boolean equals(Object obj) {
|
|
if (obj == this) {
|
|
return true;
|
|
}
|
|
if (obj instanceof ByteString) {
|
|
ByteString byteString = (ByteString) obj;
|
|
if (byteString.size() == size() && rangeEquals(0, byteString, 0, size())) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public byte getByte(int i) {
|
|
Util.checkOffsetAndCount(this.directory[this.segments.length - 1], i, 1L);
|
|
int segment = segment(i);
|
|
int i2 = segment == 0 ? 0 : this.directory[segment - 1];
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr = this.segments;
|
|
return bArr[segment][(i - i2) + iArr[bArr.length + segment]];
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public int hashCode() {
|
|
int i = this.hashCode;
|
|
if (i != 0) {
|
|
return i;
|
|
}
|
|
int length = this.segments.length;
|
|
int i2 = 0;
|
|
int i3 = 1;
|
|
int i4 = 0;
|
|
while (i2 < length) {
|
|
byte[] bArr = this.segments[i2];
|
|
int[] iArr = this.directory;
|
|
int i5 = iArr[length + i2];
|
|
int i6 = iArr[i2];
|
|
int i7 = (i6 - i4) + i5;
|
|
while (i5 < i7) {
|
|
i3 = (i3 * 31) + bArr[i5];
|
|
i5++;
|
|
}
|
|
i2++;
|
|
i4 = i6;
|
|
}
|
|
this.hashCode = i3;
|
|
return i3;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String hex() {
|
|
return toByteString().hex();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString hmacSha1(ByteString byteString) {
|
|
return toByteString().hmacSha1(byteString);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString hmacSha256(ByteString byteString) {
|
|
return toByteString().hmacSha256(byteString);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public int indexOf(byte[] bArr, int i) {
|
|
return toByteString().indexOf(bArr, i);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
byte[] internalArray() {
|
|
return toByteArray();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public int lastIndexOf(byte[] bArr, int i) {
|
|
return toByteString().lastIndexOf(bArr, i);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString md5() {
|
|
return toByteString().md5();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public boolean rangeEquals(int i, ByteString byteString, int i2, int i3) {
|
|
if (i < 0 || i > size() - i3) {
|
|
return false;
|
|
}
|
|
int segment = segment(i);
|
|
while (i3 > 0) {
|
|
int i4 = segment == 0 ? 0 : this.directory[segment - 1];
|
|
int min = Math.min(i3, ((this.directory[segment] - i4) + i4) - i);
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr = this.segments;
|
|
if (!byteString.rangeEquals(i2, bArr[segment], (i - i4) + iArr[bArr.length + segment], min)) {
|
|
return false;
|
|
}
|
|
i += min;
|
|
i2 += min;
|
|
i3 -= min;
|
|
segment++;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString sha1() {
|
|
return toByteString().sha1();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString sha256() {
|
|
return toByteString().sha256();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public int size() {
|
|
return this.directory[this.segments.length - 1];
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String string(Charset charset) {
|
|
return toByteString().string(charset);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString substring(int i) {
|
|
return toByteString().substring(i);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString toAsciiLowercase() {
|
|
return toByteString().toAsciiLowercase();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString toAsciiUppercase() {
|
|
return toByteString().toAsciiUppercase();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public byte[] toByteArray() {
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr = this.segments;
|
|
byte[] bArr2 = new byte[iArr[bArr.length - 1]];
|
|
int length = bArr.length;
|
|
int i = 0;
|
|
int i2 = 0;
|
|
while (i < length) {
|
|
int[] iArr2 = this.directory;
|
|
int i3 = iArr2[length + i];
|
|
int i4 = iArr2[i];
|
|
System.arraycopy(this.segments[i], i3, bArr2, i2, i4 - i2);
|
|
i++;
|
|
i2 = i4;
|
|
}
|
|
return bArr2;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String toString() {
|
|
return toByteString().toString();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public String utf8() {
|
|
return toByteString().utf8();
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public void write(OutputStream outputStream) throws IOException {
|
|
if (outputStream == null) {
|
|
throw new IllegalArgumentException("out == null");
|
|
}
|
|
int length = this.segments.length;
|
|
int i = 0;
|
|
int i2 = 0;
|
|
while (i < length) {
|
|
int[] iArr = this.directory;
|
|
int i3 = iArr[length + i];
|
|
int i4 = iArr[i];
|
|
outputStream.write(this.segments[i], i3, i4 - i2);
|
|
i++;
|
|
i2 = i4;
|
|
}
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public ByteString substring(int i, int i2) {
|
|
return toByteString().substring(i, i2);
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
void write(Buffer buffer) {
|
|
int length = this.segments.length;
|
|
int i = 0;
|
|
int i2 = 0;
|
|
while (i < length) {
|
|
int[] iArr = this.directory;
|
|
int i3 = iArr[length + i];
|
|
int i4 = iArr[i];
|
|
Segment segment = new Segment(this.segments[i], i3, (i3 + i4) - i2, true, false);
|
|
Segment segment2 = buffer.head;
|
|
if (segment2 == null) {
|
|
segment.prev = segment;
|
|
segment.next = segment;
|
|
buffer.head = segment;
|
|
} else {
|
|
segment2.prev.push(segment);
|
|
}
|
|
i++;
|
|
i2 = i4;
|
|
}
|
|
buffer.size += i2;
|
|
}
|
|
|
|
@Override // okio.ByteString
|
|
public boolean rangeEquals(int i, byte[] bArr, int i2, int i3) {
|
|
if (i < 0 || i > size() - i3 || i2 < 0 || i2 > bArr.length - i3) {
|
|
return false;
|
|
}
|
|
int segment = segment(i);
|
|
while (i3 > 0) {
|
|
int i4 = segment == 0 ? 0 : this.directory[segment - 1];
|
|
int min = Math.min(i3, ((this.directory[segment] - i4) + i4) - i);
|
|
int[] iArr = this.directory;
|
|
byte[][] bArr2 = this.segments;
|
|
if (!Util.arrayRangeEquals(bArr2[segment], (i - i4) + iArr[bArr2.length + segment], bArr, i2, min)) {
|
|
return false;
|
|
}
|
|
i += min;
|
|
i2 += min;
|
|
i3 -= min;
|
|
segment++;
|
|
}
|
|
return true;
|
|
}
|
|
}
|