2014-10-06 3 views
0

Мне нужно передать данные между Java и C-приложением.Base64 Ascii-кодировка в Java

Двоичные данные, закодированные с использованием org.apache.commons.codec.binary.Base64Base64.encodeBase64 (binaryData), неправильно декодируются в приложении «C».

Я думаю, что мне нужно кодировать, используя шаблон «ASCII».

Как сделать кодировку двоичных данных Base64 ASCII в Java?

ответ

0

Если вы используете JDK 8, выберите java.util.Base64 и вложенный класс, java.util.Base64.Encoder.

Base64.getEncoder() вернет вам Base64.Encoder.

+0

Нет. Я ухожу Java 7 – user1316830

+0

Вы пробовали декодировать вывод 'encodeBase64' на стороне Java? Интересно, может ли проблема быть в декодировании в приложении C. – juh

+0

Да, на стороне java все правильно. – user1316830

2

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» включен или отключен в одном или другом кодере/декодере?

0

Существует несколько различных вариантов «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

Смежные вопросы