GNU Octave - base64_decode / base64_encode

时间:2016-02-11 13:59:42

标签: java base64 octave

我有以下问题: 在java程序中,我将字符串编码为base64格式:

package my;

import java.util.Base64;

public class base64 {

    public static void main(String[] args) {
        // check for an input
        if(args.length > 0)
        {
            Base64.Encoder encoder = java.util.Base64.getEncoder();

            for(int i = 0; i< args.length; ++i)
            {
                String encoded = encoder.encodeToString(args[i].getBytes());
                System.out.println(encoded);
            }
        }
    }

}

字符串......

firstname lastname<$!$>email@domain.tld<$!$>message

...导致:

Zmlyc3RuYW1lIGxhc3RuYW1lPCQhJD5lbWFpbEBkb21haW4udGxkPCQhJD5tZXNzYWdl

这似乎工作正常。但是如果我想使用以下程序将这个base64-string解码回GNU Octave中的普通字符串:

b64encoded = "Zmlyc3RuYW1lIGxhc3RuYW1lPCQhJD5lbWFpbEBkb21haW4udGxkPCQhJD5tZXNzYWdl";
decoded = base64_decode(b64encoded);

%output the type and the string
disp(typeinfo(decoded));
disp(["decoded : " decoded]);

...我每次都会收到以下错误消息之一。

error: base64_decode: incorrect input size

error: base64_decode: input was not valid base64

由于这不起作用,我试图用Octave编码给定的字符串,但这不起作用,因为我不明白如何将字符串转换为base64_encode想要作为输入的数组类型。之后我用Google搜索了2天,阅读了很多帖子,文档并尝试了解Octaves base64_encode和base64_decode的底层c实现,但这对我没有帮助。

所以我的主要问题是:

  1. 我对八度解码功能的误解是什么?
  2. 如何将anoctave字符串编码为base64?
  3. 提前致谢,

    nioerd

1 个答案:

答案 0 :(得分:1)

正如文档所示,Octave函数base64_decode不是通用的base64解码器函数,而是一个返回编码为二进制的双精度数组的函数:

  

内置函数:x = base64_decode(s)

     

从base64编码的字符串s中解码 double 矩阵或数组x。

你可以在GNU Octave的源代码中看到相同的内容:

56 Array<double>
57 octave_base64_decode (const std::string& str)

并且&#34;不正确的输入大小&#34;错误是因为你的字符串不是double(通常是8字节)long的大小的倍数:

76       if ((outlen % (sizeof (double) / sizeof (char))) != 0)
77         {
78           ::free (out);
79           (*current_liboctave_error_handler)
80             ("base64_decode: incorrect input size");
81         }

那是你的问题1:你做错了什么,base64_decode函数不是为了解码字符串,而是为了解码二进制双精度。

您的问题2:扩展程序包strings提供了执行编码/解码字符串的函数base64encodebase64decode(没有下划线):

http://octave.sourceforge.net/strings/