Сериализация отсутствующих новых строк текстового файла

#java #perl #xml-rpc

#java #perl #xml-rpc

Вопрос:

Я пытаюсь поместить локальный файл на удаленный хост с помощью XML-RPC Base64 encode / decode. Это отлично работает для двоичных файлов, но когда я пытаюсь отправить текстовый файл, все окончания строк удаляются. Почему это происходит?

На стороне клиента,

 my $buf;
my $encoded = '';
while (read($FILE, $buf, 60 * 57)) {
   $encoded .= encode_base64($buf);
}
  

Затем он отправляет его на мой сервер Redstone XML-RPC, который принимает его и записывает:

 // Create file
   File file = new File(path);
   file.createNewFile();

// Decode the encoded data sent over into bytes
   byte[] bytes = Base64.decode(data.getBytes());

// Write them out to the file
    FileOutputStream os = new FileOutputStream(file);
    os.write(bytes);
    os.flush();
    os.close();
  

Комментарии:

1. 1. Надеюсь, вы используете хороший текстовый редактор (например, Notepad ), а не notepad.exe (он не распознает символы новой строки Unix). 2. Просмотрите документацию вашего кода, чтобы убедиться, что как encode, так и decode правильно обрабатывают символы новой строки на основе вашей комбинации ОС (отправитель / получатель).

2. Ваше чтение и запись кажутся правильными. Может быть, ваши окончания строк имеют только LF, а ваша целевая система хочет, чтобы CRLF заканчивался как строка? Можете ли вы проверить, исчезают ли окончания строк на стороне клиента или сервера, т. Е. Присутствуют ли они в переданных данных base64?

3. Это смущает.. но @thekashyap # 1 был точен. Notepad отлично распознает окончания строк. Сервер фактически работал локально, поэтому я бы просто взял его с одного пути и перешел на другой путь.

4. Отлично.. Я так понимаю, что проблема решена? Не стесняйтесь публиковать ответ самостоятельно и принимать его, чтобы он был доступен другим как ответ, а не как комментарий.

Ответ №1:

Попробуйте установить $FILE в двоичном режиме, вам нужно указать после команды open:

 open my $FILE, '<', 'the_file_name.extension';
binmode $FILE;

# your code ...
  

Ответ №2:

Проблема заключалась в том, что я открывал в Блокноте, который не распознавал окончания CRLF.