Кодировщик в оболочке Base64 для записи в поток TCP возвращает искаженные байты

#java #kotlin #tcp #base64 #outputstream

Вопрос:

Я пытаюсь передать содержимое в кодировке base64 в выходной поток от клиента kotlin по протоколу TCP на сервер python. Когда я читаю на стороне python, у меня нет результата в кодировке base64. Вот код:

 private val o = ObjectMapper().disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)
fun encode(cmdBodyRequest: ClientRequest, output: OutputStream) {
    output.write("""{"req":"${cmdBodyRequest.req}","work_def":"""".toByteArray())
    val wrappedOutputStream = Base64.getEncoder().wrap(output)
    o.writeValue(wrappedOutputStream, mapOf("hello" to "world"))
    wrappedOutputStream.close()
    output.write(""}".toByteArray())
    output.write("n".toByteArray())
}
 

На стороне сервера python я просто читаю строку из программы чтения потоков. Мой результат выглядит так:

 {"req":"549ebd95-41cb-46f1-93fa-dc355f70f16a","work_def":"x00x00x00Ix00x00x00mx00x00x00Ux00x00x00yx00x00x00ax00x00x00Gx00x00x00xx00x00x00ix00x00x00Rx00x00x003x00x00x00hx00x00x002x00x00x00Ux00x00x00Fx00x00x00hx00x00x00kx00x00x00dx00x00x00mx00x00x00Nx00x00x00tx00x00x00ex00x00x00Gx00x00x00tx00x00x00mx00x00x00Ux00x00x00Tx00x00x000x00x00x009"}n'
 

Моя цель состоит в том, чтобы base64 кодировал work_def, который может быть очень большой вложенной структурой json (я только что использовал mapOf(«привет» миру») для целей тестирования), чтобы предотвратить его декодирование python в дикт, чего я не хочу. Это дорого, и серверу не нужно знать содержимое work_def, ему просто нужно передать запрос другому клиенту. Я также хочу избежать кодирования base64 в памяти на стороне клиента, так как я не хочу использовать дополнительные байты для копии объекта с кодировкой base64. Я хочу, чтобы кодировка base64 выполнялась в выходном потоке, чтобы предотвратить дополнительные накладные расходы.

Любая помощь в том, что я делаю неправильно или как этого можно достичь, была бы очень признательна.

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

1. Код, которым вы поделились, работает на меня. Вы пробовали использовать ByteArrayOutputStream для захвата выходных данных и их проверки?

2. Между прочим, остерегайтесь встраивания cmdBodyRequest.req непосредственно в ваш JSON, если вы не абсолютно уверены , что он никогда не может содержать кавычку, обратную косую черту или любой другой символ, который сделал бы JSON недействительным. Возможно, вы захотите рассмотреть возможность использования вашего объекта-адаптера для преобразования его в строку JSON и встраивания ее вместо этого.

3. Вы на 100% уверены, что именно этот код генерирует этот вывод? Я спрашиваю , потому что строка, которую вы получили, на самом деле {hello=world} , но закодирована с помощью base64 дважды и с некоторым дополнительным мусором. Вы уверены, что это не результат тестирования или экспериментов с кодом?