【问题标题】:GNU Octave - base64_decode / base64_encodeGNU Octave - base64_decode / base64_encode
【发布时间】:2022-02-20 14:20:45
【问题描述】:

我有以下问题: 在 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 字符串解码回 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 想要作为输入的数组类型。之后我用谷歌搜索了 2 天,阅读了很多帖子、文档,还试图了解 Octaves base64_encode 和 base64_decode 的底层 c 实现,但这也对我没有帮助。

所以我的主要问题是:

  1. 我在使用 octaves 解码功能时犯了什么错误?
  2. 如何将 anoctave 字符串编码为 base64?

提前致谢,

nierd

【问题讨论】:

  • Java base64 编码器的结果很好,你可以在base64decode.org(和base64encode.org)上查看所以你的问题真的不是关于Java,而只是关于Gnu Octave

标签: java base64 octave


【解决方案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)

而“不正确的输入大小”错误是因为您的字符串不是双精度(通常为 8 字节)长的大小的倍数:

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/

【讨论】:

  • 感谢您的提示!我已经尝试过从八度锻造的琴弦延伸,并立即进入下一个洞。 base64decode 函数只能解码为 ASCII,但我需要 UTF-8。你有什么想法吗?
【解决方案2】:

试试这个...



function r=isOctave()
    a=ver;
    a=a(1).Name;
    r=isequal(a,'Octave');
end

function r=base64decode8(d)
    if isOctave
        r=typecast(base64_decode(d),'char');
    else
        r=char(matlab.net.base64decode(d));
    end
    r=r(r>0);
end

function r=base64encode8(d)
    d=[d,repmat(char(0),1,7-mod(length(d)-1,8))]; % add zero characters to expand length to factor of 8
    if isOctave
        r=base64_encode(uint8(d));
    else
        r=matlab.net.base64encode(uint8(d));
    end
end

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多