Строка в байтовый массив без кодирования в Java

Я использую com.google.protobuf.ByteString и пытаюсь сериализовать его, чтобы сохранить в виде строки.

String value = Arrays.toString(byteString.toByteArray());

Теперь я хочу перевернуть его и превратить обратно в byteString.

byte[] byteArray = value.getBytes(); ??
ByteString.copyFrom(byteArray);

Я сомневаюсь, что это сработает. Пример ByteString в строковом формате с использованием первой строки выше выглядит следующим образом [0, 0, 0, 0, 1, -118, 7, -52, 0, 0]. И это нормально, я не против хранить это. Кажется, что эти символы полностью представлены в виде чисел. Теперь я хочу отменить это, чтобы воссоздать ByteString. Проблема в том, что я не знаю, как преобразовать его обратно в массив байтов и отменить Arrays.toString(byte[]).

Изначально я не знаю кодировку массива байтов. Это из идентификатора воспроизведения Salesforce. У меня также нет простого способа сохранить его в виде байтовых данных. Есть ли какой-нибудь необычный Arrays.UndoString() или мне нужно написать свою собственную функцию?

Я думаю, во-первых, вам следует протестировать свой код, чтобы убедиться, что он работает. Публикация непроверенного кода скорее не уважает время тех, кто пытается ответить. Однако в этом случае я бы рассмотрел возможность определения собственного класса, который имел бы как строку Java, так и исходную строку байтов. Это позволяет избежать проблемы перевода обратно. class MyString { private String s; private ByteString b; //etc. }

markspace 05.09.2024 21:29

@markspace это скорее вопрос о том, как отменить Arrays.toString(byte[]). Я просто привел пример кода для идеи. Невозможно, чтобы string.getBytes() работал, поскольку он использует кодировку по умолчанию.

coloradoman 05.09.2024 21:36

@markspace создание класса не решит мою проблему сериализации массива байтов. Мне нужно сохранить его как строку. Мне также нужно его десериализовать.

coloradoman 05.09.2024 21:39

На самом деле ваш com.google.protobuf.ByteString — это Serializable, поэтому наиболее безопасным для вас подходом будет его сериализация и последующее применение к нему одной из альтернатив @Sören. Таким образом, вы можете реализовать свою амбицию: «Теперь я хочу обратить это вспять, чтобы воссоздать ByteString».

g00se 05.09.2024 22:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Arrays.toString на самом деле не предназначен для отмены. Конечно, вы могли бы написать для этого парсер. Но зачем, если есть альтернативы?

Альтернатива 1: Base64

Использовать

import java.util.Base64;
Base64.getEncoder().encodeToString(yourarray)

чтобы преобразовать ваш массив в строку и

Base64.getDecoder().decode(yourstring)

чтобы вернуть массив.

Альтернатива 2: JSON

В результате получаются более читаемые строки, но требуется внешняя библиотека, которой много. Поэтому я не буду приводить здесь пример кода.

Кодировка Base64 может работать. Я попробую.

coloradoman 05.09.2024 21:54

Большинство вложений байтовых массивов будет осуществляться в формате BaseSomething, наиболее распространенным из них является Base16.

Louis Wasserman 05.09.2024 21:57

Да, это сработало, я чувствую себя глупо, потому что не подумал об этом.

coloradoman 06.09.2024 16:52

Другие вопросы по теме