我需要在Java和C應用程序之間傳輸數據。Base64在Java中的Ascii編碼
使用org.apache.commons.codec.binary.Base64Base64.encodeBase64(binaryData)編碼的二進制數據在「C」應用程序中得不到正確解碼。
我想我需要使用「ASCII」模式進行編碼。
那麼如何在Java中使用Base64 ASCII編碼二進制數據?
我需要在Java和C應用程序之間傳輸數據。Base64在Java中的Ascii編碼
使用org.apache.commons.codec.binary.Base64Base64.encodeBase64(binaryData)編碼的二進制數據在「C」應用程序中得不到正確解碼。
我想我需要使用「ASCII」模式進行編碼。
那麼如何在Java中使用Base64 ASCII編碼二進制數據?
如果使用JDK 8是一個選項,請檢查java.util.Base64
和嵌套類java.util.Base64.Encoder
。
Base64.getEncoder()
將返回給您一個Base64.Encoder
。
Base64是 ASCII編碼。當您使用Base64算法編碼二進制數據時,輸出爲ASCII字節。這是Base64的主要目的。這裏有一些代碼來證明它:
import javax.xml.bind.DatatypeConverter;
import java.nio.charset.Charset;
import org.apache.commons.codec.binary.Base64;
public class Main {
public static void main(String[] args) {
String s = "我愛我的狗.";
byte[] base64Encoded = Base64.encodeBase64(s.getBytes());
Charset ascii = Charset.forName("US-ASCII");
String asciiEncoded = new String(base64Encoded, ascii);
System.out.println(DatatypeConverter.printHexBinary(base64Encoded));
System.out.println(DatatypeConverter.printHexBinary(asciiEncoded.getBytes()));
}
}
您使用的Apache Base64編碼器是可靠的。什麼是您正在使用的C解碼器?你如何將數據從Java轉移到C?你確定你正在「接收」C端的相同字節嗎?
一個可能的問題是您正在使用不同版本的Base64編碼算法對您的字節進行編碼/解碼。 Base64有許多變種。例如,請參閱this article。
是否有可能在一個或其他編碼器/解碼器中啓用/禁用「safe URL encoding」?
有幾種不同的「base64」變種;你可能會遇到兩個不兼容的問題。
https://en.wikipedia.org/wiki/Base64#Variants_summary_table
的主要區別是在編碼組中的「最後兩個」字符,線長度的限制。
java.util.Base64讓你三個不同的變種 https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
之間選擇當有一個選擇,我建議大家與官方RFC 4648第4編碼去。 https://tools.ietf.org/html/rfc4648#section-4
不,我是uisng Java 7 – user1316830 2014-10-06 17:38:19
您是否嘗試過在Java端解碼'encodeBase64'的輸出?我想知道這個問題是否可能出現在C應用程序的解碼中。 – juh 2014-10-06 17:54:11
是的,在Java方面,一切都是正確的。 – user1316830 2014-10-07 13:07:57