В настоящее время я пытаюсь использовать java для создания запросов для решателей DWave. На данный момент я пытаюсь понять часть JSON-кодирования. Особенно то, как должны передаваться параметры задачи.
В описании просто написано: двойники с прямым порядком байтов в кодировке base64 (см. https://docs.dwavesys.com/docs/latest/c_rest_api_5.html) что только мало информации. Чтобы попытаться получить информацию, я попытался декодировать строку в примере. (Тот, который начинается с AAAAAAAA4L8AAAAAAADwPwAAAAAAAAAAAAAAAAAA+H+amZmZmZnJP....). Попытка декодировать его приводила только к исключению IllegalArgumentException, или при сокращении строки иногда возвращалась какая-то тарабарщина.
Кто-нибудь знает, как это работает?
(Я пытался посмотреть исходный код ocean-sdk, однако я недостаточно хорошо разбираюсь в python, чтобы читать его)
Пример в документации содержит несколько строк в кодировке 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 Я добавил ссылку, как преобразовать двойные числа в байты. надеюсь, это поможет
Большое спасибо! Я продолжу исследовать, как кодировать мои данные оттуда!