繁体   English   中英

用Java将二进制编码为BASE64并在node.js中对其进行解码

[英]Encoding a binary as BASE64 in Java and decoding it in node.js

我有一个Pentaho进程,它是通过Java通过base编码二进制(pdf)的-使用以下命令:

步骤:将文件内容加载到内存输出中:pdf_content

然后

步骤:Javascript输出:encString

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

然后

步骤:Rest Client(发布数据)

在NodeJ方面

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. 是否存在在Java编码和Node Js解码之间通信base64的已知方法?
  2. 关于Pentaho中的base64编码,还有其他建议吗?

这是在Java端对其进行编码的方式:

在Java 7中使用Google番石榴的com.google.common.io.BaseEncodingcom.google.common.io.Files

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

在Java 8中使用java.util.Base64java.nio.file.Files / java.nio.file.Paths

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

并在节点端解码(同步版本):

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

以下是调用node.js流程并证明其正确性的相应的Java端测试(针对Java8本机java.util.Base64和Guava的com.google.common.io.BaseEncoding ):

@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

这两个测试都是在OSX / unix上用Java 8执行的,但是此处使用的Guava 19与Java 7完全兼容,如果node可执行文件在Windows的路径上,则没有理由不能在此处运行测试(只要它也可以评估-e参数后面的脚本,不知道)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM