1004 lines
40 KiB
Java
1004 lines
40 KiB
Java
|
package com.google.common.io;
|
||
|
|
||
|
import com.google.common.base.Ascii;
|
||
|
import com.google.common.base.Objects;
|
||
|
import com.google.common.base.Preconditions;
|
||
|
import com.google.common.math.IntMath;
|
||
|
import com.google.common.primitives.UnsignedBytes;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.io.OutputStream;
|
||
|
import java.io.Reader;
|
||
|
import java.io.Writer;
|
||
|
import java.math.RoundingMode;
|
||
|
import java.util.Arrays;
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
public abstract class BaseEncoding {
|
||
|
private static final BaseEncoding BASE64 = new Base64Encoding("base64()", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", '=');
|
||
|
private static final BaseEncoding BASE64_URL = new Base64Encoding("base64Url()", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", '=');
|
||
|
private static final BaseEncoding BASE32 = new StandardBaseEncoding("base32()", "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", '=');
|
||
|
private static final BaseEncoding BASE32_HEX = new StandardBaseEncoding("base32Hex()", "0123456789ABCDEFGHIJKLMNOPQRSTUV", '=');
|
||
|
private static final BaseEncoding BASE16 = new Base16Encoding("base16()", "0123456789ABCDEF");
|
||
|
|
||
|
public abstract boolean canDecode(CharSequence charSequence);
|
||
|
|
||
|
abstract int decodeTo(byte[] bArr, CharSequence charSequence) throws DecodingException;
|
||
|
|
||
|
public abstract InputStream decodingStream(Reader reader);
|
||
|
|
||
|
abstract void encodeTo(Appendable appendable, byte[] bArr, int i, int i2) throws IOException;
|
||
|
|
||
|
public abstract OutputStream encodingStream(Writer writer);
|
||
|
|
||
|
public abstract BaseEncoding lowerCase();
|
||
|
|
||
|
abstract int maxDecodedSize(int i);
|
||
|
|
||
|
abstract int maxEncodedSize(int i);
|
||
|
|
||
|
public abstract BaseEncoding omitPadding();
|
||
|
|
||
|
public abstract BaseEncoding upperCase();
|
||
|
|
||
|
public abstract BaseEncoding withPadChar(char c);
|
||
|
|
||
|
public abstract BaseEncoding withSeparator(String str, int i);
|
||
|
|
||
|
BaseEncoding() {
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
public static final class DecodingException extends IOException {
|
||
|
public DecodingException(String str) {
|
||
|
super(str);
|
||
|
}
|
||
|
|
||
|
DecodingException(Throwable th) {
|
||
|
super(th);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public String encode(byte[] bArr) {
|
||
|
return encode(bArr, 0, bArr.length);
|
||
|
}
|
||
|
|
||
|
public final String encode(byte[] bArr, int i, int i2) {
|
||
|
Preconditions.checkPositionIndexes(i, i + i2, bArr.length);
|
||
|
StringBuilder sb = new StringBuilder(maxEncodedSize(i2));
|
||
|
try {
|
||
|
encodeTo(sb, bArr, i, i2);
|
||
|
return sb.toString();
|
||
|
} catch (IOException e) {
|
||
|
throw new AssertionError(e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public final ByteSink encodingSink(CharSink charSink) {
|
||
|
Preconditions.checkNotNull(charSink);
|
||
|
return new ByteSink(this, charSink) { // from class: com.google.common.io.BaseEncoding.1
|
||
|
final BaseEncoding this$0;
|
||
|
final CharSink val$encodedSink;
|
||
|
|
||
|
{
|
||
|
this.this$0 = this;
|
||
|
this.val$encodedSink = charSink;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.ByteSink
|
||
|
public OutputStream openStream() throws IOException {
|
||
|
return this.this$0.encodingStream(this.val$encodedSink.openStream());
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
private static byte[] extract(byte[] bArr, int i) {
|
||
|
if (i == bArr.length) {
|
||
|
return bArr;
|
||
|
}
|
||
|
byte[] bArr2 = new byte[i];
|
||
|
System.arraycopy(bArr, 0, bArr2, 0, i);
|
||
|
return bArr2;
|
||
|
}
|
||
|
|
||
|
public final byte[] decode(CharSequence charSequence) {
|
||
|
try {
|
||
|
return decodeChecked(charSequence);
|
||
|
} catch (DecodingException e) {
|
||
|
throw new IllegalArgumentException(e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
final byte[] decodeChecked(CharSequence charSequence) throws DecodingException {
|
||
|
CharSequence trimTrailingPadding = trimTrailingPadding(charSequence);
|
||
|
byte[] bArr = new byte[maxDecodedSize(trimTrailingPadding.length())];
|
||
|
return extract(bArr, decodeTo(bArr, trimTrailingPadding));
|
||
|
}
|
||
|
|
||
|
public final ByteSource decodingSource(CharSource charSource) {
|
||
|
Preconditions.checkNotNull(charSource);
|
||
|
return new ByteSource(this, charSource) { // from class: com.google.common.io.BaseEncoding.2
|
||
|
final BaseEncoding this$0;
|
||
|
final CharSource val$encodedSource;
|
||
|
|
||
|
{
|
||
|
this.this$0 = this;
|
||
|
this.val$encodedSource = charSource;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.ByteSource
|
||
|
public InputStream openStream() throws IOException {
|
||
|
return this.this$0.decodingStream(this.val$encodedSource.openStream());
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
CharSequence trimTrailingPadding(CharSequence charSequence) {
|
||
|
return (CharSequence) Preconditions.checkNotNull(charSequence);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
/* loaded from: classes2.dex */
|
||
|
public static final class Alphabet {
|
||
|
final int bitsPerChar;
|
||
|
final int bytesPerChunk;
|
||
|
private final char[] chars;
|
||
|
final int charsPerChunk;
|
||
|
private final byte[] decodabet;
|
||
|
final int mask;
|
||
|
private final String name;
|
||
|
private final boolean[] validPadding;
|
||
|
|
||
|
Alphabet(String str, char[] cArr) {
|
||
|
this.name = (String) Preconditions.checkNotNull(str);
|
||
|
this.chars = (char[]) Preconditions.checkNotNull(cArr);
|
||
|
try {
|
||
|
int log2 = IntMath.log2(cArr.length, RoundingMode.UNNECESSARY);
|
||
|
this.bitsPerChar = log2;
|
||
|
int min = Math.min(8, Integer.lowestOneBit(log2));
|
||
|
try {
|
||
|
this.charsPerChunk = 8 / min;
|
||
|
this.bytesPerChunk = log2 / min;
|
||
|
this.mask = cArr.length - 1;
|
||
|
byte[] bArr = new byte[128];
|
||
|
Arrays.fill(bArr, (byte) -1);
|
||
|
for (int i = 0; i < cArr.length; i++) {
|
||
|
char c = cArr[i];
|
||
|
Preconditions.checkArgument(c < 128, "Non-ASCII character: %s", c);
|
||
|
Preconditions.checkArgument(bArr[c] == -1, "Duplicate character: %s", c);
|
||
|
bArr[c] = (byte) i;
|
||
|
}
|
||
|
this.decodabet = bArr;
|
||
|
boolean[] zArr = new boolean[this.charsPerChunk];
|
||
|
for (int i2 = 0; i2 < this.bytesPerChunk; i2++) {
|
||
|
zArr[IntMath.divide(i2 << 3, this.bitsPerChar, RoundingMode.CEILING)] = true;
|
||
|
}
|
||
|
this.validPadding = zArr;
|
||
|
} catch (ArithmeticException e) {
|
||
|
String str2 = new String(cArr);
|
||
|
throw new IllegalArgumentException(str2.length() != 0 ? "Illegal alphabet ".concat(str2) : new String("Illegal alphabet "), e);
|
||
|
}
|
||
|
} catch (ArithmeticException e2) {
|
||
|
int length = cArr.length;
|
||
|
StringBuilder sb = new StringBuilder(35);
|
||
|
sb.append("Illegal alphabet length ");
|
||
|
sb.append(length);
|
||
|
throw new IllegalArgumentException(sb.toString(), e2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
final char encode(int i) {
|
||
|
return this.chars[i];
|
||
|
}
|
||
|
|
||
|
final boolean isValidPaddingStartPosition(int i) {
|
||
|
return this.validPadding[i % this.charsPerChunk];
|
||
|
}
|
||
|
|
||
|
final boolean canDecode(char c) {
|
||
|
return c <= 127 && this.decodabet[c] != -1;
|
||
|
}
|
||
|
|
||
|
final int decode(char c) throws DecodingException {
|
||
|
if (c > 127) {
|
||
|
String valueOf = String.valueOf(Integer.toHexString(c));
|
||
|
throw new DecodingException(valueOf.length() != 0 ? "Unrecognized character: 0x".concat(valueOf) : new String("Unrecognized character: 0x"));
|
||
|
}
|
||
|
byte b = this.decodabet[c];
|
||
|
if (b != -1) {
|
||
|
return b;
|
||
|
}
|
||
|
if (c <= ' ' || c == 127) {
|
||
|
String valueOf2 = String.valueOf(Integer.toHexString(c));
|
||
|
throw new DecodingException(valueOf2.length() != 0 ? "Unrecognized character: 0x".concat(valueOf2) : new String("Unrecognized character: 0x"));
|
||
|
}
|
||
|
StringBuilder sb = new StringBuilder(25);
|
||
|
sb.append("Unrecognized character: ");
|
||
|
sb.append(c);
|
||
|
throw new DecodingException(sb.toString());
|
||
|
}
|
||
|
|
||
|
private boolean hasLowerCase() {
|
||
|
for (char c : this.chars) {
|
||
|
if (Ascii.isLowerCase(c)) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private boolean hasUpperCase() {
|
||
|
for (char c : this.chars) {
|
||
|
if (Ascii.isUpperCase(c)) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
final Alphabet upperCase() {
|
||
|
if (!hasLowerCase()) {
|
||
|
return this;
|
||
|
}
|
||
|
Preconditions.checkState(!hasUpperCase(), "Cannot call upperCase() on a mixed-case alphabet");
|
||
|
char[] cArr = new char[this.chars.length];
|
||
|
int i = 0;
|
||
|
while (true) {
|
||
|
char[] cArr2 = this.chars;
|
||
|
if (i < cArr2.length) {
|
||
|
cArr[i] = Ascii.toUpperCase(cArr2[i]);
|
||
|
i++;
|
||
|
} else {
|
||
|
return new Alphabet(String.valueOf(this.name).concat(".upperCase()"), cArr);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
final Alphabet lowerCase() {
|
||
|
if (!hasUpperCase()) {
|
||
|
return this;
|
||
|
}
|
||
|
Preconditions.checkState(!hasLowerCase(), "Cannot call lowerCase() on a mixed-case alphabet");
|
||
|
char[] cArr = new char[this.chars.length];
|
||
|
int i = 0;
|
||
|
while (true) {
|
||
|
char[] cArr2 = this.chars;
|
||
|
if (i < cArr2.length) {
|
||
|
cArr[i] = Ascii.toLowerCase(cArr2[i]);
|
||
|
i++;
|
||
|
} else {
|
||
|
return new Alphabet(String.valueOf(this.name).concat(".lowerCase()"), cArr);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public final boolean matches(char c) {
|
||
|
byte[] bArr = this.decodabet;
|
||
|
return c < bArr.length && bArr[c] != -1;
|
||
|
}
|
||
|
|
||
|
public final boolean equals(Object obj) {
|
||
|
if (obj instanceof Alphabet) {
|
||
|
return Arrays.equals(this.chars, ((Alphabet) obj).chars);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public final int hashCode() {
|
||
|
return Arrays.hashCode(this.chars);
|
||
|
}
|
||
|
|
||
|
public final String toString() {
|
||
|
return this.name;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static class StandardBaseEncoding extends BaseEncoding {
|
||
|
final Alphabet alphabet;
|
||
|
private transient BaseEncoding lowerCase;
|
||
|
final Character paddingChar;
|
||
|
private transient BaseEncoding upperCase;
|
||
|
|
||
|
StandardBaseEncoding(String str, String str2, Character ch) {
|
||
|
this(new Alphabet(str, str2.toCharArray()), ch);
|
||
|
}
|
||
|
|
||
|
StandardBaseEncoding(Alphabet alphabet, Character ch) {
|
||
|
this.alphabet = (Alphabet) Preconditions.checkNotNull(alphabet);
|
||
|
Preconditions.checkArgument(ch == null || !alphabet.matches(ch.charValue()), "Padding character %s was already in alphabet", ch);
|
||
|
this.paddingChar = ch;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
int maxEncodedSize(int i) {
|
||
|
return this.alphabet.charsPerChunk * IntMath.divide(i, this.alphabet.bytesPerChunk, RoundingMode.CEILING);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public OutputStream encodingStream(Writer writer) {
|
||
|
Preconditions.checkNotNull(writer);
|
||
|
return new OutputStream(this, writer) { // from class: com.google.common.io.BaseEncoding.StandardBaseEncoding.1
|
||
|
final StandardBaseEncoding this$0;
|
||
|
final Writer val$out;
|
||
|
int bitBuffer = 0;
|
||
|
int bitBufferLength = 0;
|
||
|
int writtenChars = 0;
|
||
|
|
||
|
{
|
||
|
this.this$0 = this;
|
||
|
this.val$out = writer;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.OutputStream
|
||
|
public void write(int i) throws IOException {
|
||
|
this.bitBuffer = (i & 255) | (this.bitBuffer << 8);
|
||
|
this.bitBufferLength += 8;
|
||
|
while (this.bitBufferLength >= this.this$0.alphabet.bitsPerChar) {
|
||
|
this.val$out.write(this.this$0.alphabet.encode((this.bitBuffer >> (this.bitBufferLength - this.this$0.alphabet.bitsPerChar)) & this.this$0.alphabet.mask));
|
||
|
this.writtenChars++;
|
||
|
this.bitBufferLength -= this.this$0.alphabet.bitsPerChar;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // java.io.OutputStream, java.io.Flushable
|
||
|
public void flush() throws IOException {
|
||
|
this.val$out.flush();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.OutputStream, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public void close() throws IOException {
|
||
|
if (this.bitBufferLength > 0) {
|
||
|
this.val$out.write(this.this$0.alphabet.encode((this.bitBuffer << (this.this$0.alphabet.bitsPerChar - this.bitBufferLength)) & this.this$0.alphabet.mask));
|
||
|
this.writtenChars++;
|
||
|
if (this.this$0.paddingChar != null) {
|
||
|
while (this.writtenChars % this.this$0.alphabet.charsPerChunk != 0) {
|
||
|
this.val$out.write(this.this$0.paddingChar.charValue());
|
||
|
this.writtenChars++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.val$out.close();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
void encodeTo(Appendable appendable, byte[] bArr, int i, int i2) throws IOException {
|
||
|
Preconditions.checkNotNull(appendable);
|
||
|
Preconditions.checkPositionIndexes(i, i + i2, bArr.length);
|
||
|
int i3 = 0;
|
||
|
while (i3 < i2) {
|
||
|
encodeChunkTo(appendable, bArr, i + i3, Math.min(this.alphabet.bytesPerChunk, i2 - i3));
|
||
|
i3 += this.alphabet.bytesPerChunk;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void encodeChunkTo(Appendable appendable, byte[] bArr, int i, int i2) throws IOException {
|
||
|
Preconditions.checkNotNull(appendable);
|
||
|
Preconditions.checkPositionIndexes(i, i + i2, bArr.length);
|
||
|
int i3 = 0;
|
||
|
Preconditions.checkArgument(i2 <= this.alphabet.bytesPerChunk);
|
||
|
long j = 0;
|
||
|
for (int i4 = 0; i4 < i2; i4++) {
|
||
|
j = (j | (bArr[i + i4] & UnsignedBytes.MAX_VALUE)) << 8;
|
||
|
}
|
||
|
int i5 = this.alphabet.bitsPerChar;
|
||
|
while (i3 < (i2 << 3)) {
|
||
|
appendable.append(this.alphabet.encode(((int) (j >>> ((((i2 + 1) << 3) - i5) - i3))) & this.alphabet.mask));
|
||
|
i3 += this.alphabet.bitsPerChar;
|
||
|
}
|
||
|
if (this.paddingChar != null) {
|
||
|
while (i3 < (this.alphabet.bytesPerChunk << 3)) {
|
||
|
appendable.append(this.paddingChar.charValue());
|
||
|
i3 += this.alphabet.bitsPerChar;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
int maxDecodedSize(int i) {
|
||
|
return (int) (((this.alphabet.bitsPerChar * i) + 7) / 8);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
CharSequence trimTrailingPadding(CharSequence charSequence) {
|
||
|
Preconditions.checkNotNull(charSequence);
|
||
|
Character ch = this.paddingChar;
|
||
|
if (ch == null) {
|
||
|
return charSequence;
|
||
|
}
|
||
|
char charValue = ch.charValue();
|
||
|
int length = charSequence.length() - 1;
|
||
|
while (length >= 0 && charSequence.charAt(length) == charValue) {
|
||
|
length--;
|
||
|
}
|
||
|
return charSequence.subSequence(0, length + 1);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public boolean canDecode(CharSequence charSequence) {
|
||
|
Preconditions.checkNotNull(charSequence);
|
||
|
CharSequence trimTrailingPadding = trimTrailingPadding(charSequence);
|
||
|
if (!this.alphabet.isValidPaddingStartPosition(trimTrailingPadding.length())) {
|
||
|
return false;
|
||
|
}
|
||
|
for (int i = 0; i < trimTrailingPadding.length(); i++) {
|
||
|
if (!this.alphabet.canDecode(trimTrailingPadding.charAt(i))) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
int decodeTo(byte[] bArr, CharSequence charSequence) throws DecodingException {
|
||
|
Preconditions.checkNotNull(bArr);
|
||
|
CharSequence trimTrailingPadding = trimTrailingPadding(charSequence);
|
||
|
if (!this.alphabet.isValidPaddingStartPosition(trimTrailingPadding.length())) {
|
||
|
int length = trimTrailingPadding.length();
|
||
|
StringBuilder sb = new StringBuilder(32);
|
||
|
sb.append("Invalid input length ");
|
||
|
sb.append(length);
|
||
|
throw new DecodingException(sb.toString());
|
||
|
}
|
||
|
int i = 0;
|
||
|
int i2 = 0;
|
||
|
while (i < trimTrailingPadding.length()) {
|
||
|
long j = 0;
|
||
|
int i3 = 0;
|
||
|
for (int i4 = 0; i4 < this.alphabet.charsPerChunk; i4++) {
|
||
|
j <<= this.alphabet.bitsPerChar;
|
||
|
if (i + i4 < trimTrailingPadding.length()) {
|
||
|
j |= this.alphabet.decode(trimTrailingPadding.charAt(i3 + i));
|
||
|
i3++;
|
||
|
}
|
||
|
}
|
||
|
int i5 = this.alphabet.bytesPerChunk;
|
||
|
int i6 = this.alphabet.bitsPerChar;
|
||
|
int i7 = (this.alphabet.bytesPerChunk - 1) << 3;
|
||
|
while (i7 >= (i5 << 3) - (i3 * i6)) {
|
||
|
bArr[i2] = (byte) ((j >>> i7) & 255);
|
||
|
i7 -= 8;
|
||
|
i2++;
|
||
|
}
|
||
|
i += this.alphabet.charsPerChunk;
|
||
|
}
|
||
|
return i2;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public InputStream decodingStream(Reader reader) {
|
||
|
Preconditions.checkNotNull(reader);
|
||
|
return new InputStream(this, reader) { // from class: com.google.common.io.BaseEncoding.StandardBaseEncoding.2
|
||
|
final StandardBaseEncoding this$0;
|
||
|
final Reader val$reader;
|
||
|
int bitBuffer = 0;
|
||
|
int bitBufferLength = 0;
|
||
|
int readChars = 0;
|
||
|
boolean hitPadding = false;
|
||
|
|
||
|
{
|
||
|
this.this$0 = this;
|
||
|
this.val$reader = reader;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public int read() throws IOException {
|
||
|
while (true) {
|
||
|
int read = this.val$reader.read();
|
||
|
if (read == -1) {
|
||
|
if (this.hitPadding || this.this$0.alphabet.isValidPaddingStartPosition(this.readChars)) {
|
||
|
return -1;
|
||
|
}
|
||
|
int i = this.readChars;
|
||
|
StringBuilder sb = new StringBuilder(32);
|
||
|
sb.append("Invalid input length ");
|
||
|
sb.append(i);
|
||
|
throw new DecodingException(sb.toString());
|
||
|
}
|
||
|
this.readChars++;
|
||
|
char c = (char) read;
|
||
|
if (this.this$0.paddingChar == null || this.this$0.paddingChar.charValue() != c) {
|
||
|
if (this.hitPadding) {
|
||
|
int i2 = this.readChars;
|
||
|
StringBuilder sb2 = new StringBuilder(61);
|
||
|
sb2.append("Expected padding character but found '");
|
||
|
sb2.append(c);
|
||
|
sb2.append("' at index ");
|
||
|
sb2.append(i2);
|
||
|
throw new DecodingException(sb2.toString());
|
||
|
}
|
||
|
int i3 = this.bitBuffer << this.this$0.alphabet.bitsPerChar;
|
||
|
this.bitBuffer = i3;
|
||
|
this.bitBuffer = this.this$0.alphabet.decode(c) | i3;
|
||
|
int i4 = this.bitBufferLength + this.this$0.alphabet.bitsPerChar;
|
||
|
this.bitBufferLength = i4;
|
||
|
if (i4 >= 8) {
|
||
|
int i5 = i4 - 8;
|
||
|
this.bitBufferLength = i5;
|
||
|
return (this.bitBuffer >> i5) & 255;
|
||
|
}
|
||
|
} else if (this.hitPadding || (this.readChars != 1 && this.this$0.alphabet.isValidPaddingStartPosition(this.readChars - 1))) {
|
||
|
this.hitPadding = true;
|
||
|
}
|
||
|
}
|
||
|
int i6 = this.readChars;
|
||
|
StringBuilder sb3 = new StringBuilder(41);
|
||
|
sb3.append("Padding cannot start at index ");
|
||
|
sb3.append(i6);
|
||
|
throw new DecodingException(sb3.toString());
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public int read(byte[] bArr, int i, int i2) throws IOException {
|
||
|
int i3 = i2 + i;
|
||
|
Preconditions.checkPositionIndexes(i, i3, bArr.length);
|
||
|
int i4 = i;
|
||
|
while (i4 < i3) {
|
||
|
int read = read();
|
||
|
if (read == -1) {
|
||
|
int i5 = i4 - i;
|
||
|
if (i5 == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
return i5;
|
||
|
}
|
||
|
bArr[i4] = (byte) read;
|
||
|
i4++;
|
||
|
}
|
||
|
return i4 - i;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public void close() throws IOException {
|
||
|
this.val$reader.close();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public BaseEncoding omitPadding() {
|
||
|
return this.paddingChar == null ? this : newInstance(this.alphabet, null);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public BaseEncoding withPadChar(char c) {
|
||
|
Character ch;
|
||
|
return (8 % this.alphabet.bitsPerChar == 0 || ((ch = this.paddingChar) != null && ch.charValue() == c)) ? this : newInstance(this.alphabet, Character.valueOf(c));
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public BaseEncoding withSeparator(String str, int i) {
|
||
|
for (int i2 = 0; i2 < str.length(); i2++) {
|
||
|
Preconditions.checkArgument(!this.alphabet.matches(str.charAt(i2)), "Separator (%s) cannot contain alphabet characters", str);
|
||
|
}
|
||
|
Character ch = this.paddingChar;
|
||
|
if (ch != null) {
|
||
|
Preconditions.checkArgument(str.indexOf(ch.charValue()) < 0, "Separator (%s) cannot contain padding character", str);
|
||
|
}
|
||
|
return new SeparatedBaseEncoding(this, str, i);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public BaseEncoding upperCase() {
|
||
|
BaseEncoding baseEncoding = this.upperCase;
|
||
|
if (baseEncoding == null) {
|
||
|
Alphabet upperCase = this.alphabet.upperCase();
|
||
|
baseEncoding = upperCase == this.alphabet ? this : newInstance(upperCase, this.paddingChar);
|
||
|
this.upperCase = baseEncoding;
|
||
|
}
|
||
|
return baseEncoding;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public BaseEncoding lowerCase() {
|
||
|
BaseEncoding baseEncoding = this.lowerCase;
|
||
|
if (baseEncoding == null) {
|
||
|
Alphabet lowerCase = this.alphabet.lowerCase();
|
||
|
baseEncoding = lowerCase == this.alphabet ? this : newInstance(lowerCase, this.paddingChar);
|
||
|
this.lowerCase = baseEncoding;
|
||
|
}
|
||
|
return baseEncoding;
|
||
|
}
|
||
|
|
||
|
BaseEncoding newInstance(Alphabet alphabet, Character ch) {
|
||
|
return new StandardBaseEncoding(alphabet, ch);
|
||
|
}
|
||
|
|
||
|
public String toString() {
|
||
|
StringBuilder sb = new StringBuilder("BaseEncoding.");
|
||
|
sb.append(this.alphabet.toString());
|
||
|
if (8 % this.alphabet.bitsPerChar != 0) {
|
||
|
if (this.paddingChar == null) {
|
||
|
sb.append(".omitPadding()");
|
||
|
} else {
|
||
|
sb.append(".withPadChar('");
|
||
|
sb.append(this.paddingChar);
|
||
|
sb.append("')");
|
||
|
}
|
||
|
}
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
public boolean equals(Object obj) {
|
||
|
if (!(obj instanceof StandardBaseEncoding)) {
|
||
|
return false;
|
||
|
}
|
||
|
StandardBaseEncoding standardBaseEncoding = (StandardBaseEncoding) obj;
|
||
|
return this.alphabet.equals(standardBaseEncoding.alphabet) && Objects.equal(this.paddingChar, standardBaseEncoding.paddingChar);
|
||
|
}
|
||
|
|
||
|
public int hashCode() {
|
||
|
return this.alphabet.hashCode() ^ Objects.hashCode(this.paddingChar);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static final class Base16Encoding extends StandardBaseEncoding {
|
||
|
final char[] encoding;
|
||
|
|
||
|
Base16Encoding(String str, String str2) {
|
||
|
this(new Alphabet(str, str2.toCharArray()));
|
||
|
}
|
||
|
|
||
|
private Base16Encoding(Alphabet alphabet) {
|
||
|
super(alphabet, null);
|
||
|
this.encoding = new char[512];
|
||
|
Preconditions.checkArgument(alphabet.chars.length == 16);
|
||
|
for (int i = 0; i < 256; i++) {
|
||
|
this.encoding[i] = alphabet.encode(i >>> 4);
|
||
|
this.encoding[i | 256] = alphabet.encode(i & 15);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding.StandardBaseEncoding, com.google.common.io.BaseEncoding
|
||
|
final void encodeTo(Appendable appendable, byte[] bArr, int i, int i2) throws IOException {
|
||
|
Preconditions.checkNotNull(appendable);
|
||
|
Preconditions.checkPositionIndexes(i, i + i2, bArr.length);
|
||
|
for (int i3 = 0; i3 < i2; i3++) {
|
||
|
int i4 = bArr[i + i3] & UnsignedBytes.MAX_VALUE;
|
||
|
appendable.append(this.encoding[i4]);
|
||
|
appendable.append(this.encoding[i4 | 256]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding.StandardBaseEncoding, com.google.common.io.BaseEncoding
|
||
|
final int decodeTo(byte[] bArr, CharSequence charSequence) throws DecodingException {
|
||
|
Preconditions.checkNotNull(bArr);
|
||
|
if (charSequence.length() % 2 == 1) {
|
||
|
int length = charSequence.length();
|
||
|
StringBuilder sb = new StringBuilder(32);
|
||
|
sb.append("Invalid input length ");
|
||
|
sb.append(length);
|
||
|
throw new DecodingException(sb.toString());
|
||
|
}
|
||
|
int i = 0;
|
||
|
int i2 = 0;
|
||
|
while (i < charSequence.length()) {
|
||
|
bArr[i2] = (byte) ((this.alphabet.decode(charSequence.charAt(i)) << 4) | this.alphabet.decode(charSequence.charAt(i + 1)));
|
||
|
i += 2;
|
||
|
i2++;
|
||
|
}
|
||
|
return i2;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding.StandardBaseEncoding
|
||
|
final BaseEncoding newInstance(Alphabet alphabet, Character ch) {
|
||
|
return new Base16Encoding(alphabet);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static final class Base64Encoding extends StandardBaseEncoding {
|
||
|
Base64Encoding(String str, String str2, Character ch) {
|
||
|
this(new Alphabet(str, str2.toCharArray()), ch);
|
||
|
}
|
||
|
|
||
|
private Base64Encoding(Alphabet alphabet, Character ch) {
|
||
|
super(alphabet, ch);
|
||
|
Preconditions.checkArgument(alphabet.chars.length == 64);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding.StandardBaseEncoding, com.google.common.io.BaseEncoding
|
||
|
final void encodeTo(Appendable appendable, byte[] bArr, int i, int i2) throws IOException {
|
||
|
Preconditions.checkNotNull(appendable);
|
||
|
int i3 = i + i2;
|
||
|
Preconditions.checkPositionIndexes(i, i3, bArr.length);
|
||
|
while (i2 >= 3) {
|
||
|
int i4 = i + 3;
|
||
|
int i5 = (bArr[i + 2] & UnsignedBytes.MAX_VALUE) | ((bArr[i] & UnsignedBytes.MAX_VALUE) << 16) | ((bArr[i + 1] & UnsignedBytes.MAX_VALUE) << 8);
|
||
|
appendable.append(this.alphabet.encode(i5 >>> 18));
|
||
|
appendable.append(this.alphabet.encode((i5 >>> 12) & 63));
|
||
|
appendable.append(this.alphabet.encode((i5 >>> 6) & 63));
|
||
|
appendable.append(this.alphabet.encode(i5 & 63));
|
||
|
i2 -= 3;
|
||
|
i = i4;
|
||
|
}
|
||
|
if (i < i3) {
|
||
|
encodeChunkTo(appendable, bArr, i, i3 - i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding.StandardBaseEncoding, com.google.common.io.BaseEncoding
|
||
|
final int decodeTo(byte[] bArr, CharSequence charSequence) throws DecodingException {
|
||
|
Preconditions.checkNotNull(bArr);
|
||
|
CharSequence trimTrailingPadding = trimTrailingPadding(charSequence);
|
||
|
if (!this.alphabet.isValidPaddingStartPosition(trimTrailingPadding.length())) {
|
||
|
int length = trimTrailingPadding.length();
|
||
|
StringBuilder sb = new StringBuilder(32);
|
||
|
sb.append("Invalid input length ");
|
||
|
sb.append(length);
|
||
|
throw new DecodingException(sb.toString());
|
||
|
}
|
||
|
int i = 0;
|
||
|
int i2 = 0;
|
||
|
while (i < trimTrailingPadding.length()) {
|
||
|
int i3 = i + 2;
|
||
|
int decode = (this.alphabet.decode(trimTrailingPadding.charAt(i)) << 18) | (this.alphabet.decode(trimTrailingPadding.charAt(i + 1)) << 12);
|
||
|
int i4 = i2 + 1;
|
||
|
bArr[i2] = (byte) (decode >>> 16);
|
||
|
if (i3 < trimTrailingPadding.length()) {
|
||
|
int i5 = i + 3;
|
||
|
int decode2 = decode | (this.alphabet.decode(trimTrailingPadding.charAt(i3)) << 6);
|
||
|
int i6 = i2 + 2;
|
||
|
bArr[i4] = (byte) (decode2 >>> 8);
|
||
|
if (i5 < trimTrailingPadding.length()) {
|
||
|
i += 4;
|
||
|
i2 += 3;
|
||
|
bArr[i6] = (byte) (decode2 | this.alphabet.decode(trimTrailingPadding.charAt(i5)));
|
||
|
} else {
|
||
|
i2 = i6;
|
||
|
i = i5;
|
||
|
}
|
||
|
} else {
|
||
|
i2 = i4;
|
||
|
i = i3;
|
||
|
}
|
||
|
}
|
||
|
return i2;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding.StandardBaseEncoding
|
||
|
final BaseEncoding newInstance(Alphabet alphabet, Character ch) {
|
||
|
return new Base64Encoding(alphabet, ch);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static Reader ignoringReader(Reader reader, String str) {
|
||
|
Preconditions.checkNotNull(reader);
|
||
|
Preconditions.checkNotNull(str);
|
||
|
return new Reader(reader, str) { // from class: com.google.common.io.BaseEncoding.3
|
||
|
final Reader val$delegate;
|
||
|
final String val$toIgnore;
|
||
|
|
||
|
{
|
||
|
this.val$delegate = reader;
|
||
|
this.val$toIgnore = str;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Reader
|
||
|
public int read() throws IOException {
|
||
|
int read;
|
||
|
do {
|
||
|
read = this.val$delegate.read();
|
||
|
if (read == -1) {
|
||
|
break;
|
||
|
}
|
||
|
} while (this.val$toIgnore.indexOf((char) read) >= 0);
|
||
|
return read;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Reader
|
||
|
public int read(char[] cArr, int i, int i2) throws IOException {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Reader, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public void close() throws IOException {
|
||
|
this.val$delegate.close();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
static Appendable separatingAppendable(Appendable appendable, String str, int i) {
|
||
|
Preconditions.checkNotNull(appendable);
|
||
|
Preconditions.checkNotNull(str);
|
||
|
Preconditions.checkArgument(i > 0);
|
||
|
return new Appendable(i, appendable, str) { // from class: com.google.common.io.BaseEncoding.4
|
||
|
int charsUntilSeparator;
|
||
|
final int val$afterEveryChars;
|
||
|
final Appendable val$delegate;
|
||
|
final String val$separator;
|
||
|
|
||
|
{
|
||
|
this.val$afterEveryChars = i;
|
||
|
this.val$delegate = appendable;
|
||
|
this.val$separator = str;
|
||
|
this.charsUntilSeparator = i;
|
||
|
}
|
||
|
|
||
|
@Override // java.lang.Appendable
|
||
|
public Appendable append(char c) throws IOException {
|
||
|
if (this.charsUntilSeparator == 0) {
|
||
|
this.val$delegate.append(this.val$separator);
|
||
|
this.charsUntilSeparator = this.val$afterEveryChars;
|
||
|
}
|
||
|
this.val$delegate.append(c);
|
||
|
this.charsUntilSeparator--;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // java.lang.Appendable
|
||
|
public Appendable append(CharSequence charSequence, int i2, int i3) throws IOException {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
@Override // java.lang.Appendable
|
||
|
public Appendable append(CharSequence charSequence) throws IOException {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
static Writer separatingWriter(Writer writer, String str, int i) {
|
||
|
return new Writer(separatingAppendable(writer, str, i), writer) { // from class: com.google.common.io.BaseEncoding.5
|
||
|
final Writer val$delegate;
|
||
|
final Appendable val$separatingAppendable;
|
||
|
|
||
|
{
|
||
|
this.val$separatingAppendable = r1;
|
||
|
this.val$delegate = writer;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Writer
|
||
|
public void write(int i2) throws IOException {
|
||
|
this.val$separatingAppendable.append((char) i2);
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Writer
|
||
|
public void write(char[] cArr, int i2, int i3) throws IOException {
|
||
|
throw new UnsupportedOperationException();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Writer, java.io.Flushable
|
||
|
public void flush() throws IOException {
|
||
|
this.val$delegate.flush();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.Writer, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public void close() throws IOException {
|
||
|
this.val$delegate.close();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static final class SeparatedBaseEncoding extends BaseEncoding {
|
||
|
private final int afterEveryChars;
|
||
|
private final BaseEncoding delegate;
|
||
|
private final String separator;
|
||
|
|
||
|
SeparatedBaseEncoding(BaseEncoding baseEncoding, String str, int i) {
|
||
|
this.delegate = (BaseEncoding) Preconditions.checkNotNull(baseEncoding);
|
||
|
this.separator = (String) Preconditions.checkNotNull(str);
|
||
|
this.afterEveryChars = i;
|
||
|
Preconditions.checkArgument(i > 0, "Cannot add a separator after every %s chars", i);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
final CharSequence trimTrailingPadding(CharSequence charSequence) {
|
||
|
return this.delegate.trimTrailingPadding(charSequence);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
final int maxEncodedSize(int i) {
|
||
|
int maxEncodedSize = this.delegate.maxEncodedSize(i);
|
||
|
return maxEncodedSize + (this.separator.length() * IntMath.divide(Math.max(0, maxEncodedSize - 1), this.afterEveryChars, RoundingMode.FLOOR));
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final OutputStream encodingStream(Writer writer) {
|
||
|
return this.delegate.encodingStream(separatingWriter(writer, this.separator, this.afterEveryChars));
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
final void encodeTo(Appendable appendable, byte[] bArr, int i, int i2) throws IOException {
|
||
|
this.delegate.encodeTo(separatingAppendable(appendable, this.separator, this.afterEveryChars), bArr, i, i2);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
final int maxDecodedSize(int i) {
|
||
|
return this.delegate.maxDecodedSize(i);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final boolean canDecode(CharSequence charSequence) {
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
for (int i = 0; i < charSequence.length(); i++) {
|
||
|
char charAt = charSequence.charAt(i);
|
||
|
if (this.separator.indexOf(charAt) < 0) {
|
||
|
sb.append(charAt);
|
||
|
}
|
||
|
}
|
||
|
return this.delegate.canDecode(sb);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
final int decodeTo(byte[] bArr, CharSequence charSequence) throws DecodingException {
|
||
|
StringBuilder sb = new StringBuilder(charSequence.length());
|
||
|
for (int i = 0; i < charSequence.length(); i++) {
|
||
|
char charAt = charSequence.charAt(i);
|
||
|
if (this.separator.indexOf(charAt) < 0) {
|
||
|
sb.append(charAt);
|
||
|
}
|
||
|
}
|
||
|
return this.delegate.decodeTo(bArr, sb);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final InputStream decodingStream(Reader reader) {
|
||
|
return this.delegate.decodingStream(ignoringReader(reader, this.separator));
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final BaseEncoding omitPadding() {
|
||
|
return this.delegate.omitPadding().withSeparator(this.separator, this.afterEveryChars);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final BaseEncoding withPadChar(char c) {
|
||
|
return this.delegate.withPadChar(c).withSeparator(this.separator, this.afterEveryChars);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final BaseEncoding withSeparator(String str, int i) {
|
||
|
throw new UnsupportedOperationException("Already have a separator");
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final BaseEncoding upperCase() {
|
||
|
return this.delegate.upperCase().withSeparator(this.separator, this.afterEveryChars);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.io.BaseEncoding
|
||
|
public final BaseEncoding lowerCase() {
|
||
|
return this.delegate.lowerCase().withSeparator(this.separator, this.afterEveryChars);
|
||
|
}
|
||
|
|
||
|
public final String toString() {
|
||
|
String valueOf = String.valueOf(this.delegate);
|
||
|
String str = this.separator;
|
||
|
int i = this.afterEveryChars;
|
||
|
StringBuilder sb = new StringBuilder(String.valueOf(valueOf).length() + 31 + String.valueOf(str).length());
|
||
|
sb.append(valueOf);
|
||
|
sb.append(".withSeparator(\"");
|
||
|
sb.append(str);
|
||
|
sb.append("\", ");
|
||
|
sb.append(i);
|
||
|
sb.append(")");
|
||
|
return sb.toString();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static BaseEncoding base64Url() {
|
||
|
return BASE64_URL;
|
||
|
}
|
||
|
|
||
|
public static BaseEncoding base64() {
|
||
|
return BASE64;
|
||
|
}
|
||
|
|
||
|
public static BaseEncoding base32Hex() {
|
||
|
return BASE32_HEX;
|
||
|
}
|
||
|
|
||
|
public static BaseEncoding base32() {
|
||
|
return BASE32;
|
||
|
}
|
||
|
|
||
|
public static BaseEncoding base16() {
|
||
|
return BASE16;
|
||
|
}
|
||
|
}
|