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» включен или отключен в одном или другом кодере/декодере?
Нет. Я ухожу Java 7 – user1316830
Вы пробовали декодировать вывод 'encodeBase64' на стороне Java? Интересно, может ли проблема быть в декодировании в приложении C. – juh
Да, на стороне java все правильно. – user1316830