2016-08-30 2 views
0

У меня есть процесс Pentaho, который является base64, кодирующий двоичный (PDF) с помощью Java - с помощью этой команды:Кодирование двоичного кода в качестве BASE64 в Java и его расшифровке в node.js

Шаг: Загрузка содержимого файла В память Выходы: pdf_content

Тогда

Шаг: Javascript Выходы: encString

var encString = new Packages.java.lang.String(Packages.org.apache.commons.codec.binary.Base64.encodeBase64(pdf_content.getBytes())); 

Тогда

Шаг: Rest Client (сообщений данных)

На стороне NodeJs

const binary = new Buffer(base64Encoded, 'base64'); 

Проблема заключается в том, что двоичный файл на узле сторона отличается от исходной (у меня есть доступ к файлам и их копирование).

Дальнейшее запутывание вопроса Я представил промежуточный шаг, сохраняющий base64Encoded строку на диск перед декодированием. Я также затем открыл исходный файл (с Pentaho Side) и закодированы, что с помощью

Buffer(fs.readFileSync(originalPath)).toString('base64') 

и сравнили базы 64 закодированные версии каждого. Я надеялся подтвердить, что алгоритм отличается (хотя гарантии нет). Сами файлы были одинаковой длины и начинались и заканчивались без различий. Рассеянный о файле был кучей незначительных различий. 1 байт здесь 1 байт.

Другие биты: Apache.Commons ... Base64 использует «rfc 2045». Буфер на стороне узла Js использует «rfc 4648» (я могу неправильно истолковать описание). Вопросы,

  1. Есть ли известный способ связи base64 между Java-кодировкой и декодированием Node Js?
  2. Существуют ли другие рекомендации по кодировке base64 в Pentaho?
+0

FWIW, [RFC 4648] (https://tools.ietf.org/html/rfc4648), по-видимому, является фактической кодировкой base64 и упоминает некоторые ограничения из [RFC 2045] (https: //www.ietf. org/rfc/rfc2045.txt), поэтому на первый взгляд они не кажутся несовместимыми. – ssube

+0

Да, я так понял. Я надеялся, что смогу понять, как перевести между ними, но это не кажется вероятным. Я не могу найти совместимую реализацию на стороне узла ... Я думаю, что моя реализация Java - это гонг, который будет ограничен предварительно установленным 1.7 – akaphenom

ответ

0

Вот как вы закодировать его на стороне Java:

в Java 7 с помощью Google гуавы-х com.google.common.io.BaseEncoding и com.google.common.io.Files:

byte[] data = BaseEncoding.base64().encode(bytes).getBytes(); 
Files.write(data, new File(outputFile)); 

в Java 8, используя java.util.Base64 и java.nio.file.Files/java.nio.file.Paths:

byte[] data = Base64.getEncoder().encode(bytes); 
Files.write(Paths.get(outputFile), data); 

и декодировать на стороне узла (синхронно ve rsion):

var fs = require("fs"); 
var buf fs.readFileSync("fromJava.dat"); 
var res = new Buffer(buf.toString(), "base64").toString("utf-8"); 

А вот соответствующие Java-боковые тесты (для Java8 родной java.util.Base64 и для com.google.common.io.BaseEncoding) ссылающегося узла гуавы в.JS процесс и доказать правильность:

@Test 
public void testJ8() throws IOException { 
    String input = "This is some UTF8 test data, which also includes some characters " 
    + "outside the 0..255 range: ❊ ✓ ❦. Let's see how we get them to node and back"; 

    byte[] data = Base64.getEncoder().encode(input.getBytes()); 
    Files.write(Paths.get("fromJava.dat"), data); 

    Process p = Runtime.getRuntime().exec(new String[]{"node", "-e", 
    "console.log(new Buffer(require('fs').readFileSync('fromJava.dat').toString(), 'base64').toString('utf-8'))"}); 
    assertEquals(input, new Scanner(p.getInputStream()).useDelimiter("\n").next()); 
} 

Пробное:

Процесс закончил с кодом выхода 0

@Test 
public void testJ7() throws IOException { 
    String input = "This is some UTF8 test data, which also includes some characters " 
    + "outside the 0..255 range: ❊ ✓ ❦. Let's see how we get them to node and back"; 

    byte[] data = BaseEncoding.base64().encode(input.getBytes()).getBytes(); 
    Files.write(data, new File("fromJava.dat")); 

    Process p = Runtime.getRuntime().exec(new String[]{"node", "-e", 
    "console.log(new Buffer(require('fs').readFileSync('fromJava.dat').toString(), 'base64').toString('utf-8'))"}); 
    assertEquals(input, new Scanner(p.getInputStream()).useDelimiter("\n").next()); 
} 

Пробное:

Процесс закончил с выходом код 0

Оба теста, выполненные с Java 8 на OSX/unix, но Guava 19, используемые здесь, полностью совместимы с Java 7, и если исполняемый файл node находится на пути в Windows, тогда нет причин, по которым тесты не будут работать там (при условии, что он также может оценить скрипт после аргумента -e, не знаю).