jimu-decompiled/sources/okio/SegmentedByteString.java
2025-05-13 19:24:51 +02:00

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;
}
}