Go и Node.js кодирование base64, проблемы с декодированием - PullRequest
0 голосов
/ 18 апреля 2019

Я - base64, кодирующая строку в Go

Затем декодирую в javascript (я пробовал 3 различных метода)

Я не могу получить результат javascript, соответствующий исходной строке Go

Go (кодирование)

a := []byte {138,143,163,224,178,73,161,15,240,121,53,192,198,182,52,245}
fmt.Println("a", string(a), a, len(a))
b := base64.StdEncoding.EncodeToString(a)
fmt.Println("b", b, []byte(b), len([]byte(b)))

js (декодирование)

 const b = [105,111,43,106,52,76,74,74,111,81,47,119,101,84,88,65,120,114,89,48,57,81,61,61];
 let bString = aesjs.utils.utf8.fromBytes(b);
 console.log("b", bString, b, b.length);

 let a1String = atob(bString);
 let a2String = Base64.decode(bString);
 let a3String = Buffer.from(bString, 'base64').toString('utf8');
 let a1 = aesjs.utils.utf8.toBytes(a1String);
 let a2 = aesjs.utils.utf8.toBytes(a2String);
 let a3 = aesjs.utils.utf8.toBytes(a3String);
 console.log("a", a1, a1.length, a2, a2.length, a3, a3.length);

Все 3 метода терпят неудачу, то есть a1! =a, a2! = a, a3! = a

Я предполагал, что кодирование / декодирование base64 будет простым

Чего мне не хватает?Спасибо

РЕДАКТИРОВАТЬ: JS-код имел «опечатку» - но проблема остается, что ai! = A, даже a1! = A2 == a3

EDIT: еслиоригинал a прост, тогда все работает. Но когда a содержит непечатаемые символы, я не могу декодировать в js. Пример, где он работает: a: = [] byte {65, 65, 65, 65, 65, 65,65, 65, 65, 65, 65, 65, 65, 65, 65, 65} Здесь это не работает: a: = [] байт {138, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

From: https://github.com/ricmoo/aes-js/blob/master/README.md

UTF8 should NOT be used to store arbitrary binary data as it is a string encoding format, not a binary encoding format

Поэтому не используйте функции, связанные с utf8, для преобразования необработанных (не utf8) двоичных данных.

0 голосов
/ 18 апреля 2019

В Go строки имеют формат UTF8:

in := "Good afternoon, or こんにちは"
buf := []byte(in)
str := base64.StdEncoding.EncodeToString(buf)
fmt.Println(str)

, который печатает представление в кодировке base64 (безопасное ASCII): R29vZCBhZnRlcm5vb24sIG9yIOOBk+OCk+OBq+OBoeOBrw==

Строки JS - UTF-16.Так что вам нужно как декодировать из base64, так и конвертировать из utf8 в utf-16.Вы можете использовать библиотеку или вспомогательную функцию, например:

function b64DecodeUnicode(str) {
    return decodeURIComponent(atob(str).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

var str = "R29vZCBhZnRlcm5vb24sIG9yIOOBk+OCk+OBq+OBoeOBrw==";
var result = b64DecodeUnicode(str);
"Good afternoon, or こんにちは"

Функция b64DecodeUnicode () скопирована из этого ответа, см. Также ссылку на MDN для получения подробной информации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...