«Двойники с прямым порядком байтов в кодировке base64» в java

В настоящее время я пытаюсь использовать java для создания запросов для решателей DWave. На данный момент я пытаюсь понять часть JSON-кодирования. Особенно то, как должны передаваться параметры задачи.

В описании просто написано: двойники с прямым порядком байтов в кодировке base64 (см. https://docs.dwavesys.com/docs/latest/c_rest_api_5.html) что только мало информации. Чтобы попытаться получить информацию, я попытался декодировать строку в примере. (Тот, который начинается с AAAAAAAA4L8AAAAAAADwPwAAAAAAAAAAAAAAAAAA+H+amZmZmZnJP....). Попытка декодировать его приводила только к исключению IllegalArgumentException, или при сокращении строки иногда возвращалась какая-то тарабарщина.

Кто-нибудь знает, как это работает?

(Я пытался посмотреть исходный код ocean-sdk, однако я недостаточно хорошо разбираюсь в python, чтобы читать его)

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

Ответы 1

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

Пример в документации содержит несколько строк в кодировке base64:

AAAAAAAA4L8AAAAAAADwPwAAAAAAAAAAAAAAAAAA+H+amZmZmZnJPwAAAAAAAPh/AAAAAAAA+H8A
AAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAA
AAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAA
AAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAA
AAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAA
APh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA
+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4
fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/
AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8A
AAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAA
AAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAA
AAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAA
AAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAA
APh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA
+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4
fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/
AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8A
AAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fw==

Первая строка расшифровывается следующим образом:

$ printf 'AAAAAAAA4L8AAAAAAADwPwAAAAAAAAAAAAAAAAAA+H+amZmZmZnJPwAAAAAAAPh/AAAAAAAA+H8A' | base64 -d | xxd
00000000: 0000 0000 0000 e0bf 0000 0000 0000 f03f  ...............?
00000010: 0000 0000 0000 0000 0000 0000 0000 f87f  ................
00000020: 9a99 9999 9999 c93f 0000 0000 0000 f87f  .......?........
00000030: 0000 0000 0000 f87f 00                   .........

Двойное число состоит из 8 октетов, поэтому первое двойное значение равно 0000 0000 0000 e0bf. Интерпретируя это как двойное число с плавающей запятой IEEE 754, вы получаете: 2.8426e-319.

Разрывы строк должны быть удалены, чтобы дать вам полный ввод в кодировке base64. Я не думаю, что разрывы строк требуются при сериализации, но вы можете просто добавить их после того, как закодируете как base64 (если они отсутствуют).

Чтобы закодировать массив двойников, вы должны сначала преобразовать в массив байтов, который затем можно передать кодировщику Base64.

Разбор полной строки base64 даст вам 128 двойных значений:

$ printf 'AAAAAAAA4L8AAAAAAADwPwAAAAAAAAAAAAAAAAAA+H+amZmZmZnJPwAAAAAAAPh/AAAAAAAA+H8A
AAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAA
....
AAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fw==' | base64 -d | xxd -p -c0 | fold -w16
000000000000e0bf
000000000000f03f
0000000000000000
000000000000f87f
9a9999999999c93f
000000000000f87f
000000000000f87f
# ... value repeated ...
000000000000f87f

Большое спасибо! Я продолжу исследовать, как кодировать мои данные оттуда!

NumericPrime 03.10.2022 15:46

@NumericPrime Я добавил ссылку, как преобразовать двойные числа в байты. надеюсь, это поможет

knittl 03.10.2022 15:51

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