Dies und das über Base64 (Java)

Ich hatte die Möglichkeit, Bilddaten in JSON und Base64-Codierung / -Decodierung einzubetten, sodass ich das, was ich überprüft habe, als Memorandum aufzeichnen werde.

Was ist Base64?

Ich werde diesen Artikel zitieren, weil er leicht verständlich erklärt wurde. https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4 Der Base64-Konvertierungsalgorithmus wird als Referenz sorgfältig und leicht verständlich beschrieben.

Einfach gesagt ・ A-z (26 Zeichen) ・ A-Z (26 Zeichen) ・ 0-9 (10 Zeichen) ・ + ・ / ・ = (Wird als Füllzeichen am Ende verwendet, um die Datenlänge auszurichten) Es scheint, dass es sich um eine Codierungsmethode handelt, die mit insgesamt 65 Zeichen ausgedrückt wird. * Das letzte "=" ist ein 64-stelliger Ausdruck, wenn kein Auffüllen erforderlich ist.

Binärdaten usw. können in 64 (oder 65) Zeichenfolgen konvertiert werden, sodass Sonderzeichen nicht in JSON enthalten sind und Daten sicher gesendet und empfangen werden können. Da es nur mit 64 (oder 65) Zeichentypen ausgedrückt wird, ist es auch ein Merkmal, dass sich die Datenmenge um das 1,3-fache (133%) erhöht.

Wenn die Base64-Codierung als MIME-Format für E-Mails verwendet wird, wird gemäß dem MIME-Standard alle 76 Zeichen ein Zeilenvorschubcode (CRLF) eingegeben. Einschließlich dieser 2 Bytes beträgt die Datenmenge etwa 137%.

Die Base64-Formate sind in die folgenden drei Muster unterteilt.

1. Basic Base64

gu2CoIKigqSCpoKogqmCq4Ktgq+CsYKzgrWCt4K5gruCvYK/gsKCxILGgsiCyYLKgsuCzILNgtCC04LWgtmC3ILdgt6C34LggqCCoA==

・ Die letzten 2 Zeichen, die ein Vielfaches von 4 sind, sind Füllzeichen "=" ・ Enthält +, / Symbole (* Wenn dies in einer URL verwendet wird, unterliegt es einer prozentualen Codierung.)

2. Base64 mit Zeilenvorschubcode für jeweils 76 Zeichen des MIME-Standards

gu2CoIKigqSCpoKogqmCq4Ktgq+CsYKzgrWCt4K5gruCvYK/gsKCxILGgsiCyYLKgsuCzILNgtCC
04LWgtmC3ILdgt6C34LggqCCoA==

・ Die letzten 2 Zeichen, die ein Vielfaches von 4 sind, sind Füllzeichen "=" ・ Enthält +, / Symbole (* Wenn dies in einer URL verwendet wird, unterliegt es einer prozentualen Codierung.)

3. URL-Safe Base64

gu2CoIKigqSCpoKogqmCq4Ktgq-CsYKzgrWCt4K5gruCvYK_gsKCxILGgsiCyYLKgsuCzILNgtCC04LWgtmC3ILdgt6C34LggqCCoA

-URL unsichere Symbole wurden konvertiert. Entfernen Sie "+" → "-", "/" → "_", "="

Verwenden Sie Anwendungen

Verwendung mit Java7,8 ~

Java8~ Seit Java8 oder höher bietet der JDK-Standard ein Dienstprogramm von java.util.Base64, daher scheint es gut, dieses zu verwenden. Java 8 oder höher wurde auf dem tatsächlichen Computer nicht überprüft. Dies ist ein sehr einfaches und leicht verständliches Codebeispiel, daher war es hilfreich. https://gist.github.com/komiya-atsushi/d878e6e4bf9ba6dae8fa

Java7 So handhaben Sie Base64 mit Java7 ...

--Verwenden Sie den Apache Commons Codec --Verwenden Sie javax.mail (mit JavaMails MimeUtility) --Verwenden von Seasar2s Base64Util --Mach dein eigenes

Und so weiter. Dieses Mal möchte ich die beiden besten "Apache Commons Codec" und "javax.mail" verwenden, die ich zum Codieren / Decodieren von Base64 zur Verfügung hatte. Die Implementierung hier implementiert ein Beispiel, das Binärdaten (Byte []) in eine Base64-Zeichenfolge (Zeichenfolge) codiert / decodiert.

Apache Commons Codec Version: Validiert mit 1.11.

Grundlegende Base64-Codierung

public static String encodeBase64(byte[] data) {
	return Base64.encodeBase64String(data);
}

⇒ `` `Base64 # encodeBase64String``` wird verwendet.

Base64-Codierung mit Zeilenvorschubcode für jeweils 76 Zeichen des MIME-Standards

public static String encodeBase64Chunked(byte[] data) {
	byte[] encoded = Base64.encodeBase64Chunked(data);
	return new String(encoded);
}

⇒ `` `Base64 # encodeBase64Chunked``` wird verwendet. Eine Schnittstelle zum Zuweisen von Zeilenvorschubcodes wurde vorbereitet.

URL-sichere Base64-Codierung

public static String encodeBase64URLSafe(byte[] data) {
	return Base64.encodeBase64URLSafeString(data);
}

⇒ `` `Base64 # encodeBase64URLSafeString``` wird verwendet. Es gab eine spezielle Schnittstelle für URL-Safe.

Dekodieren

public static byte[] decodeBase64(String data) {
	return Base64.decodeBase64(data);
}

⇒ Es scheint, dass die Dekodierung damit einheitlich erfolgen kann.

javax.mail Version: Verifiziert mit 1.4.6

Grundlegende Base64-Codierung

private static String trimCRLF(ByteArrayOutputStream encodedCRLF) {
	byte inputArray[] = encodedCRLF.toByteArray();
	byte outputArray[] = new byte[encodedCRLF.size()];

	// CR(0x0d)、LF(0x0a)Überspringen Sie das Teil und kopieren Sie es in das Ausgabearray
	int n = 0;
	for (int i = 0; i < encodedCRLF.size() - 1; i++) {
		if (inputArray[i] == 0x0d) {// CR
			if (inputArray[i + 1] == 0x0a) {// LF
				i++;
				continue;
			}
		}
		outputArray[n] = inputArray[i];
		n++;
	}
	return new String(outputArray, 0, n);
}

public static String encodeBase64(byte[] data) {
	try (ByteArrayOutputStream encodedChunked = new ByteArrayOutputStream()) {
		try (OutputStream os = MimeUtility.encode(encodedChunked, "base64")) {
			os.write(data);
			os.flush();
		}
		//Zeilenumbruchzeichen entfernen
		String encodedStr = trimCRLF(encodedChunked);
		return encodedStr;

	} catch (IOException e) {
		e.printStackTrace();
		return "Bad Encryption";
	} catch (MessagingException e) {
		e.printStackTrace();
		return "Bad Encryption";
	}
}

⇒MimeUtility scheint in der Lage zu sein, mit MimeUtility.encode zu codieren. Standardmäßig liegt es in einem MIME-basierten Format vor, das Zeilenumbrüche enthält. Daher wird der Zeilenvorschubcode entfernt, um Zeilenumbrüche zu vermeiden.

Base64-Codierung mit Zeilenvorschubcode für jeweils 76 Zeichen des MIME-Standards

public static String encodeBase64Chunked(byte[] data) {
	try (ByteArrayOutputStream encodedChunked = new ByteArrayOutputStream()) {
		try (OutputStream os = MimeUtility.encode(encodedChunked, "base64")) {
			os.write(data);
			os.flush();
		}
		return encodedChunked.toString();

	} catch (IOException e) {
		e.printStackTrace();
		return "Bad Encryption";
	} catch (MessagingException e) {
		e.printStackTrace();
		return "Bad Encryption";
	}
}

⇒ Ich verwende MimeUtility.encode.

URL-sichere Base64-Codierung

private static String urlSafeEncode(ByteArrayOutputStream encodedCRLF) {
	byte inputArray[] = encodedCRLF.toByteArray();
	byte outputArray[] = new byte[encodedCRLF.size()];

	// CR(0x0d)、LF(0x0a)Überspringen Sie das Teil und kopieren Sie es in das Ausgabearray
	int n = 0;
	for (int i = 0; i < encodedCRLF.size() - 1; i++) {
		if (inputArray[i] == 0x0d) {// CR
			if (inputArray[i + 1] == 0x0a) {// LF
				i++;
				continue;
			}
		}

		// URL-In Safe konvertieren
		if (inputArray[i] == 0x2b) {// 「+」
			outputArray[n] = 0x2d;// 「-」
		}
		else if (inputArray[i] == 0x2f) {// 「/」
			outputArray[n] = 0x5f;// 「_」
		}
		else if (inputArray[i] == 0x3d) {// 「=」
			continue;
		}
		else {
			outputArray[n] = inputArray[i];
		}
		n++;
	}
	return new String(outputArray, 0, n);
}

public static String encodeBase64URLSafe(byte[] data) {
	try (ByteArrayOutputStream encodedChunked = new ByteArrayOutputStream()) {
		try (OutputStream os = MimeUtility.encode(encodedChunked, "base64")) {
			os.write(data);
			os.flush();
		}
		//URL mit entferntem Zeilenvorschubzeichen-Mach es sicher
		String encodedURLSafe = urlSafeEncode(encodedChunked);
		return encodedURLSafe;

	} catch (IOException e) {
		e.printStackTrace();
		return "Bad Encryption";
	} catch (MessagingException e) {
		e.printStackTrace();
		return "Bad Encryption";
	}

⇒ Um URL-sicher zu machen, werden die Symbole "+", "/" und "=" zusätzlich zum Entfernen des Zeilenvorschubcodes konvertiert. Es ist sehr lang. ..

Dekodieren

public static byte[] decodeBase64(String data) {
	byte[] urlsafe = data.getBytes();
	int mod = urlsafe.length % 4;
	byte[] nosafe = new byte[urlsafe.length + mod];
	for (int i = 0; i < urlsafe.length; i++) {
		if (urlsafe[i] == 0x2d) {// 「-」
			nosafe[i] = 0x2b;// 「+」
		}
		else if (urlsafe[i] == 0x5f) {// 「_」
			nosafe[i] = 0x2f;// 「/」
		}
		else {
			nosafe[i] = urlsafe[i];
		}
	}
	//Diejenigen, die kleiner als ein Vielfaches der festen Länge sind 4=Polsterung mit
	for (int i = urlsafe.length + mod - 1; i >= urlsafe.length; i--) {
		nosafe[i] = 0x3d;// 「=」
	}

	ByteArrayInputStream from = new ByteArrayInputStream(nosafe);
	try (InputStream is = MimeUtility.decode(from, "base64"); ByteArrayOutputStream to = new ByteArrayOutputStream()) {
		byte[] buf = new byte[8192];
		int readCnt;
		while ((readCnt = is.read(buf)) != -1) {
			to.write(buf, 0, readCnt);
		}
		to.flush();
		return to.toByteArray();

	} catch (MessagingException | IOException e) {
		e.printStackTrace();
		return "Bad Decryption".getBytes();
	}
}

⇒ Es ist gewaltsam. .. Beim Dekodieren wird es wieder in URL-UnSafe konvertiert, unter der Annahme, dass die konvertierte Zeichenfolge in URL-Safe eingegeben wird. Nach dem Auffüllen von "=" entsprechend der Anzahl der Ziffern mit einem Vielfachen von 4 wird MimeUtility.decode zum Decodieren verwendet. Ich glaube nicht, dass ich normalerweise diese Art von Code schreibe.

Zusammenfassung

das ist alles.

Recommended Posts

Dies und das über Base64 (Java)
Base64 Encoder dies und das
[Über JDBC, das Java und SQL verbindet]
[Rails] strftime dies und das
Über Java-Paket und Import
Elektronisches Zertifikat dies und das
[Java] Laden Sie ein Bild hoch und konvertieren Sie es in Base64
Dies und das zum Bearbeiten von ini in Java. : inieditor-java
Informationen zu statischen und nicht statischen Java-Methoden
Über Biocontainer fastqc und Java
[Java-Anfänger] Über Abstraktion und Schnittstelle
Dies und das von JDK
Darüber ()
Informationen zu primitiven Java-Typen und Referenztypen
Dies und das der ausschließlichen Kontrolle
Dies und das von Swift Corner Radius
Über die Java-Schnittstelle
[Java] Über Arrays
Etwas über Java
Wo ist mit Java?
Informationen zu Java-Funktionen
Über Java-Threads
[Java] -Schnittstelle
Über die Java-Klasse
Java und JavaScript
Informationen zu Java-Arrays
XXE und Java
Über Java-Vererbung
Über Java Var
Über Java Literal
Informationen zu Java-Befehlen
Dies und das der bedingten Verzweigung der Schienenentwicklung
Informationen zur Java-Protokollausgabe
Informationen zur Java-Funktionsschnittstelle
Java, über zweidimensionales Array
Über die Klassenteilung (Java)
Über [Java] [StreamAPI] allMatch ()
Getter und Setter (Java)
Informationen zur Java StringBuilder-Klasse
[Java] Thread und ausführbar
Java wahr und falsch
[Java] Über Singleton Class
Über Klassen und Instanzen
[Java] Vergleich von Zeichenketten und && und ||
[Java] Über anonyme Klassen
Informationen zu Aufteilungsmethoden (Java)
Über bekommt und bekommt.chomp
[Java Silver] Informationen zur Initialisierung
Informationen zur Java-Array-Liste
Über Java-Polymorphismus super ()
Über Weiterleiten und Weiterleiten
[Java] Über Objects.equals () und Überprüfung des String-Vergleichs (== und gleich)
Informationen zur Java String-Klasse
Java - Serialisierung und Deserialisierung
[Java] Argumente und Parameter
Informationen zu Java-Zugriffsmodifikatoren
Informationen zum Java-Grunddatentyp- und Referenztypspeicher
Über Kapselung und Vererbung