mirror of https://github.com/alibaba/fastjson2.git
support more base64 decode, for issue #3687
This commit is contained in:
parent
0057929154
commit
cb4ea2d518
|
|
@ -1885,9 +1885,13 @@ public abstract class JSONReader
|
|||
public byte[] readBase64() {
|
||||
String str = readString();
|
||||
if (str != null) {
|
||||
String prefix = "data:image/jpeg;base64,";
|
||||
if (str.startsWith(prefix)) {
|
||||
str = str.substring(prefix.length());
|
||||
String prefix = "data:image/";
|
||||
int p0, p1;
|
||||
String base64 = "base64";
|
||||
if (str.startsWith(prefix)
|
||||
&& (p0 = str.indexOf(';', prefix.length() + 1)) != -1
|
||||
&& (p1 = str.indexOf(',', p0 + 1)) != -1 && str.regionMatches(p0 + 1, base64, 0, base64.length())) {
|
||||
str = str.substring(p1 + 1);
|
||||
}
|
||||
}
|
||||
if (str.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -7463,16 +7463,13 @@ class JSONReaderUTF8
|
|||
|
||||
byte[] decoded;
|
||||
if (index != offset) {
|
||||
boolean hasPrefix = true;
|
||||
String prefix = "data:image/jpeg;base64,";
|
||||
for (int i = 0; i < prefix.length(); i++) {
|
||||
if (bytes[offset + i] != prefix.charAt(i)) {
|
||||
hasPrefix = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasPrefix) {
|
||||
offset += prefix.length();
|
||||
String prefix = "data:image/";
|
||||
int p0, p1;
|
||||
String base64 = "base64";
|
||||
if (regionMatches(bytes, offset, prefix)
|
||||
&& (p0 = IOUtils.indexOfChar(bytes, ';', prefix.length() + 1, index)) != -1
|
||||
&& (p1 = IOUtils.indexOfChar(bytes, ',', p0 + 1, index)) != -1 && IOUtils.regionMatches(bytes, p0 + 1, base64)) {
|
||||
offset = p1 + 1;
|
||||
}
|
||||
|
||||
byte[] src = Arrays.copyOfRange(bytes, offset, index);
|
||||
|
|
|
|||
|
|
@ -1621,6 +1621,19 @@ public class IOUtils {
|
|||
return indexOfChar(buf, '\\', i, max);
|
||||
}
|
||||
|
||||
public static boolean regionMatches(byte[] bytes, int off, String prefix) {
|
||||
int len = prefix.length();
|
||||
if (off + len >= bytes.length) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (bytes[off + i] != prefix.charAt(i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static int indexOfChar(byte[] buf, int ch, int fromIndex, int max) {
|
||||
for (int i = fromIndex; i < max; i++) {
|
||||
if (buf[i] == ch) {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue