[英]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”(我可能误读了说明)。 问题,
这是在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);
并在节点端解码(同步版本):
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.