2016-02-11 5 views
1

У меня есть следующая проблема: Внутри программы Java я закодировать строку в формат base64:GNU Octave - base64_decode/base64_encode

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 protected]<$!$>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 

Как это не работает я пытался кодировать данную строку с Октава, но это не работает, потому что я не понимаю, как преобразовать строку в массив тип, который base64_encode хочет иметь в качестве входа. После этого я googled вокруг в течение 2 дней, читая множество сообщений, документ, а также попытался понять базовую c-версию Octaves base64_encode и base64_decode, но это также мне не помогло.

Так что мои основные вопросы:

  1. Что моя misstake с функцией октав декодирования?
  2. Как кодировать строку anoctave для base64?

Спасибо заранее,

nioerd

+0

Результат base64 кодера Java просто отлично, ты можно проверить на https://www.base64decode.org/ (и https://www.base64encode.org/). Так что ваш вопрос действительно не о Java, а только о Gnu Octave –

ответ

1

В документации показывает, функция Octave base64_decode не является функцией base64 декодер общего назначения, а функция, которая возвращает массив двойников, которые были кодируется в двоичной форме:

Встроенная функция: х = base64_decode (ы)

Decod e double матрица или массив x из кодированной base64 строки s.

Вы можете увидеть то же самое в исходном коде 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 предоставляет функции base64encode и base64decode (без подчеркивания), что делать кодирования/декодирования строки:

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

+0

Спасибо за подсказку! Я пробовал расширение строк из октавной кузницы и сразу же запускал в следующее отверстие. Функция base64decode может декодироваться только в ASCII, но мне нужен UTF-8. У вас есть идеи? – nioerd

Смежные вопросы